我有一个对象列表,其中对象具有Guid Id属性。
我还有一个包含一堆Guids的Hashset。
检查列表中的每个对象Guid是否存在于Hashset中的最快方法是什么,如果它存在,则更新列表中Object上的另一个属性?如果需要,我确实能够将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;
}
答案 0 :(得分:-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
为false)
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中的所有值都与此集合中的值一致,则此方法是有利的。在查找全部的情况下,没有理由继续迭代集合。所以,打破循环。