Bagaimana cara menggunakan Linq untuk mendapatkan daftar properti yang unik dari daftar objek?

171

Saya mencoba menggunakan Linq untuk mengembalikan daftar id yang diberikan daftar objek di mana id adalah properti. Saya ingin dapat melakukan ini tanpa mengulangi setiap objek dan mengeluarkan id unik yang saya temukan.

Saya memiliki daftar objek bertipe MyClass dan salah satu properti kelas ini adalah ID.

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

Yang ingin saya lakukan adalah menulis kueri Linq untuk mengembalikan saya daftar Id tersebut

Bagaimana saya melakukan itu dengan memberikan IList<MyClass>sedemikian sehingga mengembalikan IEnumerable<int>id?

Saya yakin itu harus dilakukan dalam satu atau dua baris menggunakan Linq daripada mengulang-ulang setiap item dalam daftar MyClass dan menambahkan nilai-nilai unik ke dalam daftar.

Bantuan apa pun dalam menciptakan solusi elegan akan sangat dihargai!

mezoid
sumber
1
Juga perhatikan Anda miliki DistinctBydi MoreLinq yang akan memberi Anda berbeda MyClassberdasarkan ID. Penggunaan:var distincts = list.DistinctBy(x => x.ID);
nawfal

Jawaban:

319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();
Marc Gravell
sumber
Wow! Saya pikir itu sesuatu yang sederhana ... Saya hanya tidak bisa memikirkannya. Sepertinya saya harus menghabiskan lebih banyak waktu membiasakan diri dengan Linq.
mezoid
29

Gunakan operator Berbeda :

var idList = yourList.Select(x=> x.ID).Distinct();
CMS
sumber
5
(titik penamaan minor; ini bukan "daftar" id - ini adalah IEnumerable <n> yang dapat dievaluasi dengan malas - kecuali Anda memanggil .ToList (), tentu saja ;-p)
Marc Gravell
@ Mark, penjelajahan 2 baris sederhana dari lazy eval? Tolong dan terima kasih: D
masfenix
2
@masfenix Malas eval berarti operasi tidak dilakukan sampai benar-benar digunakan. Dalam hal ini, pemilihan ID dan hanya memilih yang berbeda belum tentu dilakukan ketika pernyataan dalam jawaban ini dieksekusi. Ini akan dilakukan ketika Anda benar-benar mulai menelusuri melalui idList, misalnya dalam loop foreach.
Mark Meuer
13

Menggunakan Linq lurus , dengan Distinct()ekstensi:

var idList = (from x in yourList select x.ID).Distinct();
Dana
sumber
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);
        }

KELUARAN

1234567890

Elang Hitam
sumber
1
Tidak menjawab pertanyaan, dan bahkan jika itu, menambahkan tidak ada yang baru.
nawfal
2

Ketika mengambil Distinct kita harus menggunakan IEnumerable juga. Jika daftar berarti model, perlu menulis kode seperti ini

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Pergin Sheni
sumber