Это не чистый LINQ, но вы можете обменять joblist.Count
перечисления внутреннего l oop и полностью удалить его для одного перечисления attachments
...
HashSet<string> attachmentJobNumbers = new HashSet<string>(
// A one-time enumeration of attachments to collect its JobNumber values
attachments.Select(attachment => attachment.JobNumber)
);
for (int i = 0; i < joblist.Count; i++)
{
joblist[i].IsValid = attachmentJobNumbers.Contains(joblist[i].JobNumber);
}
The HashSet<>
позволяет быстро искать, есть ли вложение с конкретным JobNumber
. Это предполагает, что не существует эквивалентных JobNumber
значений, которые отличаются только регистром; в противном случае вы можете передать StringComparer
в перегрузку конструктора HashSet<>
...
HashSet<string> attachmentJobNumbers = new HashSet<string>(
// A one-time enumeration of attachments to collect its JobNumber values
attachments.Select(attachment => attachment.JobNumber),
StringComparer.OrdinalIgnoreCase
);
..., чтобы получить поиск без учета регистра.
(Из @ ответа NetMage Я узнал, что с 1025 года используется метод расширения ToHashSet()
. NET 4.7.2 /.NET Core 2.0, так что будет удобной альтернативой.)
Чистый LINQ способ сделать то же самое будет с ToDictionary()
...
// A one-time enumeration of attachments to collect its JobNumber values
Dictionary<string, attachment> attachmentsByJobNumber = attachments.ToDictionary(attachment => attachment.JobNumber);
for (int i = 0; i < joblist.Count; i++)
{
joblist[i].IsValid = attachmentsByJobNumber.ContainsKey(joblist[i].JobNumber);
}
... или ToLookup()
, хотя любой из них позволяет вам получить attachment
по JobNumber
, когда attachment
здесь не нужен, просто ответ bool
ean на «Есть ли вложение с этим JobNumber
или нет? " Я думаю, что HashSet<>
будет лучше представлять этот вариант использования.
Кроме того, имейте в виду, что. NET правила именования требуют типов и properties для использования Pascal case, поэтому вы должны использовать Job
, Attachment
и Id
(или, возможно, ID
) соответственно.