Saya bekerja dengan API dan Klien data yang mengembalikan dua IList: "perangkat" dan "produsen". Ada ~100 produsen dan ~2000 perangkat.

Manufacturer.code adalah kode dua atau tiga karakter

Pabrikan.nilai adalah nama lengkap pabrikan

Device.manufacturerCode = manufacturer.code (perangkat juga memiliki 20 properti lainnya)

Yang ingin saya lakukan adalah mengganti nilai device.manufacturerCode dengan nama lengkap pabrikan. misalnya

Sebelum: device.manufacturerCode = "AC"

Setelah: device.manufacturerCode = "Produk Acme"

Ini adalah usaha saya:

IList<deviceDTO>device = await DataClient.MakeApiHttpRequestAsync(.......);
IList<manufacturerDTO>manufacturer = await DataClient.MakeApiHttpRequestAsync(.......);

for (int i = 0; i < device.Count(); i++)
{
     device[i].ManufacturerCode = (from x in manufacturer
                                     where x.Code == device[i].ManufacturerCode
                                     select x.Value).ToList().First();
}

Ada beberapa masalah:

1) Ada duplikat di pabrikan (tetapi tidak masalah yang saya pilih selama saya memilih satu)

2) Beberapa device.manufacureCode hilang dari pabrikan, ini menyebabkan kode di atas error. Saya ingin menyimpan dua karakter jika tidak ada nama lengkap yang setara.

3) Solusi saya (bahkan jika berhasil) terlihat sangat tidak efisien.

Apakah ada cara yang lebih baik?

0
DaveP 13 Maret 2020, 18:16

1 menjawab

Jawaban Terbaik

Untuk angka-angka itu saya tidak akan stres tentang kinerja. Tapi selain itu; Saya sarankan (karena nama dapat menjadi duplikat dan apa pun akan dilakukan) Anda membuat kamus kode/nama dan membandingkan daftar perangkat Anda (hanya yang Anda kenal) dengan kamus itu. Di suatu tempat di sepanjang garis ini:

IList<deviceDTO> devices = await DataClient.MakeApiHttpRequestAsync(.......);
IList<manufacturerDTO> manufacturer = await DataClient.MakeApiHttpRequestAsync(.......);
var manufacturerList = new Dictionary<string,string>();
foreach(var code in manufacturer.Select(x => x.code).Distinct())
{
    manufacturerList.Add(code,manufacturer.First(c => c.code == code).value; 
}

foreach(var device in devices.Where(d => manufacturerList.Keys.Contains(d.manufacturerCode)))
{
    device.manufacturerCode = manufacturerList[device.manufacturerCode];
}

Di atas belum diuji dan tidak dikompilasi ...

Edit / tambahan

Untuk kesalahan # 2 Anda - itu karena Anda melakukan First pada daftar yang mungkin tidak berisi kunci Anda (selain fakta Anda melakukan perbandingan setiap iterasi) - seharusnya (dalam hal ini) FirstOrDefault .. seperti ini:

device[i].ManufacturerCode = (from x in manufacturer
                                     where x.Code == device[i].ManufacturerCode
                                     select x.Value).ToList().FirstOrDefault() ?? device[i].ManufacturerCode;
1
riffnl 13 Maret 2020, 15:46