Як використовувати Linq для отримання унікального списку властивостей зі списку об'єктів?


171

Я намагаюсь використати Linq для повернення списку ідентифікаторів, заданих списком об'єктів, де ідентифікатор є властивістю. Мені б хотілося це зробити, не переглядаючи кожен об'єкт і не витягуючи унікальні ідентифікатори, які я знаходжу.

У мене є список об'єктів типу MyClass, і однією з властивостей цього класу є ідентифікатор.

public class MyClass
{
  public int ID { get; set; }
}

Що я хочу зробити, це написати запит Linq, щоб повернути мені список цих ідентифікаторів

Як зробити те, що дається IList<MyClass>таке, що воно повертає IEnumerable<int>ідентифікатор?

Я впевнений, що це потрібно зробити в одному або двох рядках, використовуючи Linq, а не переглядати кожен елемент у списку MyClass та додавати до списку унікальні значення.

Будь-яка допомога у створенні елегантного рішення буде дуже вдячна!


1
Крім того, зверніть увагу , ви DistinctByв MoreLinq , який дасть вам різні MyClassS на основі ID. Використання:var distincts = list.DistinctBy(x => x.ID);
nawfal

Відповіді:


319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

Оце Так! Я думав, що це щось просте ... Я просто не міг про це думати. Схоже, мені доведеться витратити трохи більше часу на знайомство з Linq.
мезоїд

29

Скористайтеся оператором розрізнення :

var idList = yourList.Select(x=> x.ID).Distinct();

5
(другорядний пункт іменування; це не "список" ідентифікаторів - це ліниво оцінений IEnumerable <int> - якщо ви не зателефонуєте .ToList (), звичайно ;-p)
Marc Gravell

@Marc, просте дворядкове пояснення ледачого евалу? Будь ласка і спасибі: D
masfenix

2
@masfenix Lazy eval означає, що операція не робиться, поки вона фактично не використовується. У цьому випадку вибір ідентифікаторів та вибір лише відмінних не обов'язково робиться тоді, коли заява в цій відповіді виконується. Це буде зроблено, коли ви фактично почнете проходити через idList, наприклад, у циклі foreach.
Марк Меуер

13

Використовуючи прямий Linq , з Distinct()розширенням:

var idList = (from x in yourList select x.ID).Distinct();

3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

ВИХІД

1234567890


1
Не відповідає на запитання, і навіть якщо це є, нічого нового не додає.
nawfal

2

Коли ми приймаємо відмінні, ми також мусимо ставитись до IEnumerable. Якщо список є модельним засобом, потрібно написати такий код

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.