我正在检查列表是否有一个元素,其源和目标已经在列表中。如果不是我将该元素添加到列表中。我是这样做的:
if (!objectToSerialize.elements
.Any(x => x.data.source == edgetoAdd.data.source &&
x.data.target == edgetoAdd.data.target))
objectToSerialize.elements.Add(edgetoAdd);
这很有效但很慢。有没有办法让这部分更快? Any()
或Count
的实施速度更快吗?提前谢谢。
答案 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);
}