ไปสุดท้ายที่ซ้ำกันธาตุในรายชื่อ

0

คำถาม

ฉันมีรายชื่อบรรจุรายการที่ซ้ำกัน.

List<string> filterList = new List<string>()
{
     "postpone", "access", "success", "postpone", "success"
};

ฉันเข้าใจที่ผลลัพธ์ซึ่งมัน postpone, access, success โดยการใช้

List<string> filter = filterList.Distinct().ToList();
string a = string.Join(",", filter.Select(a => a).ToArray());
Console.WriteLine(a);

ฉันเห็นอีกตัวอย่างเช่นพวกเขาสามารถใช้ได้ groupby ไปที่ธาตุล่าสุดตั้งแต่พวกเขามีอีกรายการเหมือนหมายเลขเป็นต้น ตอนนี้ผมมีข้อความได้ยังไงฉันถึงล่าสุดงรายการในช่องรายการซึ่งก็คือ access, postpone, success? มีขอเสนออะไรบางอย่าง

c# linq
2021-11-23 10:34:46
4

คำตอบที่ดีที่สุด

2

ทางเดียวที่จะทำเรื่องนี้จะใช้ดัชนีของรายการในดั้งเดิมคลังภาพพร้อมกับ GroupBy. สำหรับตัวอย่างเช่น

    var lastDistinct = filterList.Select((x,index)=> new {Value=x,Index=index})
                                 .GroupBy(x=>x.Value)
                                 .Select(x=> x.Last())
                                 .OrderBy(x=>x.Index)
                                 .Select(x=>x.Value);
    var result = string.Join(",",lastDistinct);

ส่งออก

access,postpone,success
2021-11-23 10:58:27

ซาบซึ้งกับตัวอย่าง ช่วยมาก
yancy
0

ข้อมูลของคุณคือรายชื่อเดียวของพิมพ์ข้อความดังนั้นใช้ groupBy ไม่จริงเพิ่มอะไรเลย ถ้าคุณพิจารณาของคุณรหัสของบรรทัดแรกให้คุณหารค่ารายชื่อคุณแค่เสียงหารค่ารายการเพราะคุณทำข้อความเข้าร่วมอยู่ในสาย 2 ขวบ ทั้งหมดที่คุณต้องการจะทำคือการเพิ่มบรรทัดก่อนที่คุณมาร่วมกับ:

List<string> filter = filterList.Distinct().ToList();
string last = filter.LastOrDefault();
string a = string.Join(",", filter.Select(a => a).ToArray());
Console.WriteLine(a);

ฉันคิดว่าคุณสามารถทำให้รหัสของคุณมากก terse เพราะคุณต้องการก็เหมือนกันเลือก(กา=>เป็น)หรือ.ToArray()อยู่คุณโทรหาข้อความเข้าร่วมกับเรา

GroupBy จะถูกใช้หากคุณมีรายชื่อของชั้นเรียน/struct/บันทึก/tuple รายการอยู่ที่ไหนคุณอาจจะอยากกลุ่มโดยเฉพาะเรื่องกุญแจ(หรือปุ่ม)มากกว่าการใช้หารค่า()ในเรื่องทั้งหมด. GroupBy เป็นประโยชน์และคุณควรจะเรียนรู้มันแล้วก็ ToDictionary และ ToLookup LINQ ช่วยทำงาน functionality.

2021-11-23 10:44:48
0

เป็น OrderedDictionary ทำเรื่องนี้ ทั้งหมดที่คุณต้องทำคือของคุณเพิ่มรายการให้มันกับเป็นตรรกะของ"ถ้าหากมันอยู่ในพจนานุกรมเอามันออก เพิ่มมัน". OrderedDictionary preserves คำสั่งของการเพิ่มดังนั้นโดยการเอาออกคำก่อนหน้าการเพิ่มหนึ่งและส่งการเพิ่มมันมันกระโดดไปที่ส่วนท้ายของพจนานุกรม

var d = new OrderedDictionary();
filterList.ForEach(x => { if(d.Contains(x)) d.Remove(x); d[x] = null; });

ของคุณ d.Keys ตอนนี้กลายเป็นรายการของใช้เส้นสาย

access
postpone
success

OrderedDictionary อยู่ในโลง Collections.Specialized ย้ายไปยัง

ถ้าคุณต้องการกุญแจที่เป็นแฟ้ม csv คุณสามารถใช้ Cast เพื่อเปลี่ยนมันออกจากสิ่งที่ข้อความ

var s = string.Join(",", d.Keys.Cast<string>());
2021-11-23 18:59:40

ขอบคุณเพื่อสิ่งที่ดีสำหรับคำอธิบาย.... ฉันมีเรียนรู้สิ่งใหม่'OrderedDictionary'.
yancy
0

ดังนั้นแล้วทำไมเจ้าจะไม่สุขด้วยตอบกลับก่อนการเกิดขึ้นอีกของ"เลื่อน"? เพราะหลังจากนั้นในห้องลำดับคุณดูเหมือนคำว่า"เลื่อน"อีกครั้ง ทำไมคุณถึงคืนก่อนการเกิดขึ้นอีกขอ"ร"? เพราะหลังจากนั้นในห้องลำดับคุณไม่เห็นคำนี้อีกต่อไปแล้ว

ดังนั้น:คืลาสักครู่คำสั่งใหม่ของที่เหลือของลำดับไม่มีคำพูด

มันจะเป็นเรื่องง่ายเลยสำหรับ LINQ กับ recursion แต่มันไม่ใช่ประสิทธิภาพ:สำหรับทุกคำที่คุณจะต้องเช็คที่เหลือของลำดับที่จะเห็นถ้าคำในส่วนที่เหลือ

มันจะเป็นทางที่มีประสิทธิภาพเพื่อจำได้สูงสุดดัชนีใหคุณเจอสักคำ

เป็นส่วนขยายวิธีการ. ถ้าคุณยังไม่คุ้นเคยกับส่วนขยายวิธีการของเห็น ส่วนขยายวิธีการของ demystified.

private static IEnumerable<T> FindLastOccurences<T>(this IEnumerable<T> source)
{
    return FindLastOccurrences<T>(source, null);
}

private static IEnumerable<T> FindLastOccurences<T>(this IEnumerable<T> source,
    IEqualityComparer<T> comparer)
{
    // TODO: check source not null
    if (comparer == null) comparer = EqualityComparer<T>.Default;

    Dictionary<T, int> dictionary = new Dictionary<T, int>(comparer);

    int index = 0;
    foreach (T item in source)
    {
        // did we already see this T? = is this in the dictionary
        if (dictionary.TryGetValue(item, out int highestIndex))
        {
            // we already saw it at index highestIndex.
            dictionary[item] = index;
        }
        else
        {
            // it is not in the dictionary, we never saw this item.
            dictionary.Add(item, index);
        }
        ++index;
    }

    // return the keys after sorting by value (which contains the highest index)
    return dictionay.OrderBy(keyValuePair => keyValuePair.Value)
                    .Select(keyValuePair => keyValuePair.Key);
}
         

ดังนั้นสำหรับทุกรายการอยู่ในแหล่งลำดับเราตรวจสอบว่ามันอยู่ในพจนานุกรมแล้ว ถ้าไม่เราเพิ่มรายการเป็นกุญแจให้พจนานุกรมแล้ว คืนค่าระดัชนี

ถ้ามันเป็นอยู่แล้วอยู่ในพจนานุกรมจากนั้นก็มีค่าสูงสุดดัชนีของที่เราเจอรายการนี้มาก่อน เห็นได้ชัดว่าระดัชนีปัจจุบันคือสูงขึ้นดังนั้นเราแทนที่ค่าในพจนานุกรม

ในที่สุดเราสั่งซื้อกุญแจค่าเหลืออยู่ในพจนานุกรมโดยการส่งจดหมายค่าและคืนเดียวที่กุญแจ

2021-11-23 21:40:54

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่