检查Hashset中是否存在对象列表单个属性值

时间:2016-06-10 12:38:37

标签: c# hashset

我有一个对象列表,其中对象具有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;
    }

1 个答案:

答案 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中的所有值都与此集合中的值一致,则此方法是有利的。在查找全部的情况下,没有理由继续迭代集合。所以,打破循环。