LINQ .Any()和.Count()的更快版本

时间:2017-06-13 14:18:43

标签: c# linq

我正在检查列表是否有一个元素,其源和目标已经在列表中。如果不是我将该元素添加到列表中。我是这样做的:

if (!objectToSerialize.elements
      .Any(x => x.data.source == edgetoAdd.data.source && 
                x.data.target == edgetoAdd.data.target))
      objectToSerialize.elements.Add(edgetoAdd);

这很有效但很慢。有没有办法让这部分更快? Any()Count的实施速度更快吗?提前谢谢。

1 个答案:

答案 0 :(得分:10)

对于某些HashSet<T>,您可以将数据预先编入索引,例如T。由于您要比较两个值,因此元组可能有所帮助:

var existingValues = new HashSet<(string,string)>(
    objectToSerialize.elements.Select(x => (x.data.source, x.data.target)));

现在你可以测试

existingValues.Contains((edgetoAdd.data.source, edgetoAdd.data.target))

有效。但!!建立索引不是免费的。如果您要测试很多值,这主要有帮助。如果您只添加一个,线性搜索可能是您最好的选择。

请注意,您可以使用索引方法,索引持续多个Add次调用,您还需要记住.Add每个调用到索引时间。您可以使用hashset上的.Add的返回值来快速测试/添加对:

if(existingValues.Add((edgetoAdd.data.source, edgetoAdd.data.target)))
{
    // a new value, yay!
    objectToSerialize.elements.Add(edgetoAdd);
}