Member 9845454 Ответов: 2

Привет, как получить уникальные поля из списка int string pair, который содержит дубликаты


List<int,string> list = new List<int,string>();

//Пример скажем, если значения в моем списке равны

list[0] ={100, "abc"}
list[1] ={101, "zzz"}
list[2] ={103, "aaa"}
list[3] ={100, "yyy"}


//Я хочу, чтобы мой список возвращал только уникальные значения

//Я хочу, чтобы мой список вернулся вот так.

list={101,zzz;103,aaa};

Что я уже пробовал:

я использовал linq с Distinct (), но он дает мне не уникальное поле с первым вхождением.

phil.o

Можете ли вы показать определение вашего list переменная, а также выражение linq, которое вы пытались использовать?
Пожалуйста, не отвечайте на мой комментарий вместо этого используйте зеленый виджет "улучшить вопрос" и квалифицируйте свой вопрос с помощью этой релевантной информации.

2 Ответов

Рейтинг:
2

Karthik_Mahalingam

пробовать

List<KeyValuePair<int, string>> lst = new List<KeyValuePair<int, string>>();
        lst.Add(new KeyValuePair<int, string>(100, "abc"));
        lst.Add(new KeyValuePair<int, string>(101, "zzz"));
        lst.Add(new KeyValuePair<int, string>(103, "aaa"));
        lst.Add(new KeyValuePair<int, string>(100, "yyy"));

       
       int[] uniqueItems = lst.GroupBy(k => k.Key).Where(k => k.Count() == 1).Select(k => k.Key).ToArray();
       lst = lst.Where(k => uniqueItems.Contains(k.Key)).ToList();  //list={101,zzz;103,aaa};


Graeme_Grant

Выглядит почти идентично...

Karthik_Mahalingam

когда я собирался опубликовать решение, в этой теме не было никаких решений, и я сделал небольшой перерыв и опубликовал решение, и я увидел ваше решение.
однако мой - это длительный процесс (для лучшего понимания op) , путем получения уникальных идентификаторов и фильтрации основной коллекции.

Рейтинг:
1

Graeme_Grant

Класс List не поддерживает несколько измерений. Подробнее об этом читайте здесь: <list> (руководство по программированию на C#) | Microsoft Docs[^]

Если вы хотите использовать класс списка, то вы можете использовать массив, класс, [^]Кортеж или KeyValuePair[^] чтобы сохранить ваши ценности. Для этого решения я буду использовать список "keyvaluepair", так как у вас есть не уникальные ключи. То Словарь[^] класс требует уникальных ключей, поэтому не подходит.

var list = new List<KeyValuePair<int, string>>
{
    new KeyValuePair<int, string> (100, "abc"),
    new KeyValuePair<int, string> (101, "zzz"),
    new KeyValuePair<int, string> (103, "aaa"),
    new KeyValuePair<int, string>(100, "yyy")
};

var results = list.GroupBy(x => x.Key)
                    .Where(x => x.Count() == 1)
                    .Select(x => x.First());

foreach (var item in results)
{
    Console.WriteLine($"Key: {item.Key}  Value: {item.Value}");
}

Выражение Linq будет группироваться по ключевому полю, когда там, где есть только 1 уникальный результат на группировку, выберите первую запись.