Объединение данных в двух списках IL, содержащих пропущенные значения и дубликаты - PullRequest
0 голосов
/ 13 марта 2020

Я работаю с API и клиентом данных, который возвращает два ILists: «устройства» и «производители». Существует около 100 производителей и около 2000 устройств.

factoryr.code - это код из двух или трех символов

factoryr.value - полное имя производителя

device.manufacturerCode = factoryr.code (устройство также имеет 20 другие свойства)

Я хочу заменить значение device.manufacturerCode на полное имя производителя. например,

до: device.manufacturerCode = "A C"

после: device.manufacturerCode = "Acme Products"

Это моя попытка:

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();
}

Есть несколько проблем:

1) Есть дубликаты у производителей (но не важно, какой я выберу, если я выберу один)

2) Некоторые device.manufacureCode отсутствует у производителей, что приводит к ошибке вышеупомянутого кода. Я хочу, чтобы в нем не было двух символов, если нет эквивалентного полного имени.

3) Мое решение (даже если оно сработало) выглядит очень неэффективно.

Есть ли лучший способ?

1 Ответ

1 голос
/ 13 марта 2020

Для этих цифр я бы не стал подчеркивать производительность. Но это в сторону; Я бы посоветовал (так как имя может быть дубликатом, и любой подойдет), вы создаете словарь кодов / имен и сравниваете список устройств (только тех, кого вы знаете) с этим словарем. Примерно так:

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];
}

Выше не проверено и не откомпилировано ...

Редактировать / добавить

Для вашей ошибки # 2 - это потому, что вы делаете First в списке, который, возможно, не может содержать ваш ключ (кроме того факта, что вы делаете сравнение каждую итерацию) - это должно быть (в этом случае) FirstOrDefault .. как это:

device[i].ManufacturerCode = (from x in manufacturer
                                     where x.Code == device[i].ManufacturerCode
                                     select x.Value).ToList().FirstOrDefault() ?? device[i].ManufacturerCode;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...