Dalam ASP.NET C # Saya memiliki sebuah struct:
public struct Data
{
public int item1;
public int item2;
public int category_id;
public string category_name;
}
dan saya punya Daftar itu. Saya ingin memilih category_id
dan category_name
, menjalankan DISTINCT
dan akhirnya ORDERBY
menyala category_name
.
Inilah yang saya miliki sekarang:
List<Data> listObject = getData();
string[] catNames = listObject
.Select(i=> i.category_name)
.Distinct()
.OrderByDescending(s => s)
.ToArray();
Ini jelas hanya mendapatkan nama kategori. Pertanyaan saya adalah, bagaimana cara mendapatkan beberapa bidang, dan struktur data apa yang akan saya simpan ini (bukan a string[]
)?
EDIT
Menggunakan daftar struct tidak diatur dalam batu. Jika akan disarankan untuk mengubah struktur data dukungan saya untuk membuat pemilihan lebih mudah (saya akan menulis banyak ini) maka saya dengan senang hati akan mengambil rekomendasi.
c#
linq
data-structures
Chet
sumber
sumber
Jawaban:
Jenis anonim memungkinkan Anda untuk memilih bidang yang berubah-ubah menjadi struktur data yang sangat diketik dalam kode Anda:
Karena Anda (tampaknya) perlu menyimpannya untuk digunakan nanti, Anda bisa menggunakan operator GroupBy:
sumber
Select
menjadi tipe baru. Dalam kasus saya, saya memilih yang baruKeyValuePair
.Sunting : Jadikan lebih LINQ-ey!
sumber
Anda dapat menggunakan jenis anonim:
Compiler akan menghasilkan kode untuk kelas dengan
name
dancategory_name
properti dan mengembalikan instance dari kelas itu. Anda juga dapat secara manual menentukan nama properti:Anda dapat memiliki sejumlah properti yang berubah-ubah.
sumber
Anda dapat memilih beberapa bidang menggunakan LINQ Pilih seperti yang ditunjukkan di atas dalam berbagai contoh ini akan kembali sebagai Jenis Anonim. Jika Anda ingin menghindari jenis anonim di sini adalah trik sederhana.
Saya pikir ini menyelesaikan masalah Anda
sumber
Ini adalah tugas yang jenis anonimnya sangat cocok. Anda dapat mengembalikan objek jenis yang dibuat secara otomatis oleh kompiler, disimpulkan dari penggunaan.
Sintaksnya berupa:
Untuk kasus Anda, cobalah sesuatu seperti berikut:
sumber
Ini menggunakan jenis anonim sehingga Anda harus kata kunci var, karena jenis ekspresi yang dihasilkan tidak diketahui sebelumnya.
sumber
sumber
Anda bisa menjadikannya sebagai KeyValuePair, jadi itu akan mengembalikan a
"IEnumerable<KeyValuePair<string, string>>"
Jadi, akan seperti ini:
sumber
sumber