Как использовать 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

Используйте оператор Distinct :

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

5
(незначительная точка именования; это не «список» идентификаторов - это лениво оцениваемый IEnumerable <int> - если, конечно, вы не вызываете .ToList () ;-p)
Марк Грэвелл

@Marc, простое двухстрочное объяснение ленивого eval? Пожалуйста и спасибо: D
masfenix

2
@masfenix Ленивый 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

Принимая Distinct, мы также должны бросить в IEnumerable. Если список - это значит модель, нужно написать такой код

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.