Baris kode yang diberikan ini. Bagaimana saya bisa menulis dengan cara yang lebih optimal? Kode di bawah ini berfungsi dengan baik tetapi saya perlu cara lain untuk menulis ini

var attachments = new List<Attachments>();
foreach (var attachment in msg.attachments) //msg.attachments is a Dictionary<string, FileAttachment> type
{
  var attach = new Attachments();
  attach.name = attachment.Value.name;
  attach.type = attachment.Value.type;

  attachments.Add(attach);
}
-2
Shashwat Prakash 27 Mei 2021, 10:01

5 jawaban

Jawaban Terbaik

Apa ini yang kau inginkan?

var attachments =
    msg
        .attachments
        .Select(attachment => new Attachments()
        {
            name = attachment.Value.name,
            type = attachment.Value.type,
        })
        .ToList();
3
Enigmativity 27 Mei 2021, 07:06

Jangan lupa sintaks kueri linq:

var attachments = from att in msg.attachments 
                  select new Attachments { name = att.Value.name, type = att.Value.type };

Jika Anda menggunakannya seperti ini, Anda akan dapat menggunakan eksekusi yang ditangguhkan. Jika Anda benar-benar perlu menciutkannya ke dalam daftar, Anda cukup memanggil .ToList() di atasnya.

0
Rodrigo Rodrigues 27 Mei 2021, 08:03

Selain menggunakan sintaks lambda LINQ, Anda dapat menggunakan kueri pemahaman:

var attachments = ( from attachment in msg.attachments
                    select new Attachments
                    {
                      name = attachment.Value.name,
                      type = attachment.Value.type
                    } 
                  ).ToList();

Itu memilih instance objek baru dari setiap item dalam koleksi sumber dan mengambil Daftar kueri yang dihasilkan.

Tetapi untuk bagian kode yang begitu sederhana, seharusnya tidak ada banyak perbedaan, dalam keuntungan atau kerugian yang sangat kecil (dapat di-benchmark).

Jadi ini hanya masalah preferensi untuk kode yang bersih dan dapat dipelihara.

0
Olivier Rogier 27 Mei 2021, 07:57

Ini harus melakukan trik:

var attachments = msg.attachments
    .Select(a => new Attachments
    {
        name = a.Value.name,
        type = a.Value.type
    })
    .ToList();

Tetapi seperti yang ditunjukkan orang lain di komentar, ini tidak benar-benar lebih dioptimalkan (walaupun menurut saya sedikit lebih mudah dibaca).

1
Dnomyar96 27 Mei 2021, 07:09

Baris kode yang diberikan ini. Bagaimana saya bisa menulis dengan cara yang lebih optimal?

Anda menyebutkan LINQ, tetapi LINQ sering kali kebalikan dari "dioptimalkan" - ini memperdagangkan efisiensi jauh untuk mendapatkan kenyamanan dan (kadang-kadang) kesederhanaan. Sama sekali tidak ada yang salah dengan kode Anda yang ada. Satu-satunya tweak signifikan adalah menginisialisasi daftar target dengan panjang yang diketahui:

var attachments = new List<Attachments>(msg.attachments.Count);

Anda juga dapat melakukan hal-hal seperti menggunakan sintaksis penginisialisasi objek pada new Attachments, atau menghindari banyak .Value, tetapi sejujurnya: keduanya tidak akan membuat perbedaan yang bahkan dapat diukur dari jarak jauh. Tapi:

foreach (var attachment in msg.attachments.Values)
{
  attachments.Add(new Attachments {
    name = attachment.name, type = attachment.type
  });
}
4
Marc Gravell 27 Mei 2021, 07:33