Saya punya daftar ini:

 var items = new List<Model>
            {
                new Model { Id = 1, Name = "first item (a)" },
                new Model { Id = 2, Name = "first item (b)" },
                new Model { Id = 3, Name = "first item (c)" },
                new Model { Id = 4, Name = "second item (a)" },
                new Model { Id = 5, Name = "second item (b)" },
                new Model { Id = 6, Name = "second item (c)" },
                new Model { Id = 7, Name = "third item (a)" },
                new Model { Id = 8, Name = "third item (b)" },
                new Model { Id = 9, Name = "third item (c)" },
            };

Bagaimana saya bisa mengelompokkan semua item yang namanya dimulai dengan kata yang sama, misalnya, saya memerlukan daftar semua item yang dimulai dengan "pertama" dan daftar semua item yang dimulai dengan "kedua" dll.

Terima kasih

-1
SamBerk 24 Mei 2021, 22:29

2 jawaban

Jawaban Terbaik

Jadi, Anda ingin mengelompokkan item dengan "kata" pertama, dipisahkan dengan spasi?

Menggunakan

items.GroupBy(i => i.Name.Split()[0])
3
D Stanley 24 Mei 2021, 19:52

Jadi, Anda memiliki urutan Models, di mana setiap Model memiliki Id dan properti string Name

Bagaimana saya bisa mengelompokkan semua item yang namanya dimulai dengan kata yang sama?

Rupanya Anda harus memperkenalkan ke class Model ide Word, atau mungkin First Word.

Definisikan Kata

Anda belum menentukan Word. Apakah pembatas hanya spasi? atau apakah ada karakter spasi putih, termasuk \r dan \n? Dan apa yang Anda inginkan jika Anda memiliki dua spasi:

"Word1  Word2"

Apakah Anda memiliki dua Kata? atau mungkin tiga, sebuah kata kosong di antara dua spasi?

Tulis metode ekstensi

Tentu saja Anda seorang programmer yang baik, jadi Anda ingin membuat kode yang dapat digunakan kembali, yang dapat dipelihara, mudah dipahami. Alangkah baiknya jika Anda dapat mengujinya secara unit.

Jika dalam waktu dekat seseorang mengatakan: Anda tidak mendukung \r\n sampai sekarang, tetapi kami perlu mendukungnya sekarang, Anda tidak ingin memeriksa semua kode untuk mencari tahu di mana seseorang mencoba menemukan kata pertama dari nama modelnya.

Pertimbangkan untuk menulis beberapa metode ekstensi untuk kelas Model. Jika Anda tidak terbiasa dengan metode ekstensi, baca Metode Ekstensi Diungkapkan

Setelah Anda menulis metode ekstensi, Anda dapat menulis yang berikut:

Model model = ...
string firstWord = model.GetFirstWord();

Jadi mari kita perpanjang!

public static char[] WordSeparators {get} = new [] {' ', '\t', '.', ',', ...};

public IEnumerable<string> SplitName(this Model model)
{
    return model.Name.Split(WordSeparators);
}

Ini adalah metode yang cepat, terutama jika Anda hanya memiliki beberapa pemisah kata. Metode lain adalah menggunakan ekspresi reguler dengan "s" untuk menunjukkan ruang putih. Tapi itu terlalu panjang untuk sebuah jawaban.

public string GetFirstWord(this Model model)
{
    return model.SplitName().FirstOrDefault();
}

Kode sederhana, mudah dimengerti, mudah digunakan, dipelihara, dan bagus untuk pengujian unit.

Kembali ke pertanyaan Anda

Bagaimana saya bisa mengelompokkan semua item yang namanya dimulai dengan kata yang sama?

Setelah Anda membuat GetFirstWord kodenya adalah satu baris:

IEnumerable<Model> models = ...
var groupOfModelsThatStartWithSameWord = models.GroupBy(model => model.GetFirstWord());

Dengan kata: dari setiap model, dalam urutan model, dapatkan kata pertama. Buatlah grup model, dimana setiap grup adalah barisan Model yang memiliki kata pertama yang sama, sedangkan Key dari grup tersebut adalah kata pertama yang sama.

1
Harald Coppoolse 25 Mei 2021, 07:18