我正在检查一个列表是否有一个元素,其源和目标已经在列表中。如果不是,我将该元素添加到列表中。我这样做:
if (!objectToSerialize.elements
.Any(x => x.data.source == edgetoAdd.data.source &&
x.data.target == edgetoAdd.data.target))
objectToSerialize.elements.Add(edgetoAdd);
这很有效,但速度很慢。有没有办法让这部分更快? Any()
或 Count
有更快的实现吗?提前致谢。
最佳答案
您可以将数据预先索引到类似 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
每次都添加到索引中。您可以使用 .Add
的返回值来缩短测试/添加对在哈希集上:
if(existingValues.Add((edgetoAdd.data.source, edgetoAdd.data.target)))
{
// a new value, yay!
objectToSerialize.elements.Add(edgetoAdd);
}
关于c# - LINQ .Any() 和 .Count() 的更快版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524166/