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

jas*_*son 2 c# linq

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

if (!objectToSerialize.elements
      .Any(x => x.data.source == edgetoAdd.data.source && 
                x.data.target == edgetoAdd.data.target))
      objectToSerialize.elements.Add(edgetoAdd);
Run Code Online (Sandbox Code Playgroud)

这工作但非常缓慢.有没有办法让这部分更快?是否有更快的实施Any()Count?提前致谢.

Mar*_*ell 10

您可以将数据预先索引HashSet<T>为某些内容T.由于您要比较两个值,因此元组可能会有所帮助:

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

现在你可以测试了

existingValues.Contains((edgetoAdd.data.source, edgetoAdd.data.target))
Run Code Online (Sandbox Code Playgroud)

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

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

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