Проверьте, существует ли в Hashset значение единого свойства списка объектов
У меня есть список объектов, в которых объекты имеют свойство Guid Id.
У меня также есть Hashset, содержащий кучу гидов.
Какой самый быстрый способ проверить, существует ли каждый объект Guid в списке в Hashset, а затем обновить другое свойство объекта в списке, если он существует? У меня есть возможность изменить Hashset на другой тип данных, если это необходимо, но список должен остаться прежним.
Вот классы / перечислимые
public class Test
{
public Guid Id {get; set;}
public bool IsResponded {get; set;}
}
var clientResponses = new HashSet<Guid>();
var testRecords = new List<Test>();
Это то, чем я сейчас занимаюсь
foreach (var test in testRecords)
{
if (clientResponses.Contains(test.Id))
test.IsResponded = true;
}
1 ответ
Вы можете сделать это
foreach (var test in testRecords)
{
if (clientResponses.Remove(test.Id))
test.IsResponded = true;
}
Или, короче
foreach (var test in testRecords)
{
test.IsResponded = clientResponses.Remove(test.Id);
}
Каждое найденное значение удаляется из HashSet, поэтому каждая следующая итерация будет быстрее. Конечно, это стоит только для очень больших объемов данных. И, кроме того, необходимо воссоздать HashSet.
Также вы можете попробовать эту оптимизацию (предполагается, что свойства IsResponded
по умолчанию ложны)
foreach (var test in testRecords)
{
if (clientResponses.Remove(test.Id))
{
test.IsResponded = true;
if (clientResponses.Count == 0)
break; // the remaining IsResponded values will remain unchanged
}
}
Этот подход выгоден, если размер testRecords
коллекция значительно больше, чем размер HashSet, и с высокой вероятностью все значения из HashSet будут совпадать со значениями в этой коллекции. В случае нахождения всего, нет причин продолжать итерацию в коллекции. Итак, разорвать петлю.