Làm cách nào để sử dụng Linq để có được danh sách các thuộc tính duy nhất từ ​​danh sách các đối tượng?


171

Tôi đang cố gắng sử dụng Linq để trả về danh sách id được cung cấp danh sách các đối tượng trong đó id là thuộc tính. Tôi muốn có thể làm điều này mà không cần lặp qua từng đối tượng và lấy ra các id duy nhất mà tôi tìm thấy.

Tôi có một danh sách các đối tượng thuộc loại MyClass và một trong các thuộc tính của lớp này là ID.

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

Những gì tôi muốn làm là viết một truy vấn Linq để trả lại cho tôi một danh sách các Id đó

Làm thế nào để tôi làm điều đó với một IList<MyClass>cái mà nó trả về một IEnumerable<int>id?

Tôi chắc chắn rằng có thể thực hiện điều đó trong một hoặc hai dòng bằng cách sử dụng Linq thay vì lặp qua từng mục trong danh sách MyClass và thêm các giá trị duy nhất vào danh sách.

Bất kỳ trợ giúp trong việc tạo ra một giải pháp thanh lịch sẽ được nhiều đánh giá cao!


1
Cũng lưu ý rằng bạn có DistinctBytrong MoreLinq sẽ cung cấp cho bạn MyClasscác s khác biệt dựa trên ID. Cách sử dụng:var distincts = list.DistinctBy(x => x.ID);
nawfal

Câu trả lời:


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

Ồ Tôi nghĩ nó đơn giản ... Tôi không thể nghĩ về nó. Có vẻ như tôi sẽ phải dành thêm thời gian để làm quen với Linq.
mezoid

29

Sử dụng toán tử riêng biệt :

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

5
(nhỏ điểm đặt tên, nó không phải là một "danh sách" của id - đó là một cách lười biếng đánh giá IEnumerable <int> - trừ khi bạn gọi ToList (), tất nhiên ;-p)
Marc Gravell

@Marc, một dòng 2 đơn giản của eval lười biếng? Xin vui lòng và cảm ơn: D
masfenix

2
@masfenix Lazy eval có nghĩa là thao tác không được thực hiện cho đến khi nó thực sự được sử dụng. Trong trường hợp này, việc chọn ID và chỉ chọn những ID riêng biệt không nhất thiết phải được thực hiện khi câu lệnh trong câu trả lời này được thực thi. Nó sẽ được thực hiện khi bạn thực sự bắt đầu duyệt qua idList, ví dụ như trong một vòng lặp foreach.
Đánh dấu Meuer

13

Sử dụng Linq thẳng , với Distinct()phần mở rộng:

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);
        }

ĐẦU RA

1234567890


1
Không trả lời câu hỏi, và ngay cả khi nó không, không có gì mới.
nawfal

2

Khi sử dụng Phân biệt, chúng ta cũng phải sử dụng IEnumerable. Nếu danh sách là mô hình có nghĩa, cần phải viết mã như thế này

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.