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

标签 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 有更快的实现吗?提前致谢。

最佳答案

您可以将数据预先索引到类似 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/

相关文章:

c# - 我可以反序列化为 protobuf-net 中接口(interface)的只读属性吗?

c# - 我怎么知道协程是否仍然是 "waiting"?

asp.net-mvc - ASP.NET 使用 LINQ 处理 DB 表单

c# - LINQ 中的时区转换

C# 使用 MySQL 连接数据库

c# - 在使用 Xamarin 完成方法之前,UI 不会更新

c# - 根据不同名称的字符串属性将 2 种不同的集合相交

c# - 如何检查一个url是否有子字符串

c# - 如何在 C# 中获取两个字符串数组之间的差异?

c# - 如何在 C# 中使用 LINQ 查找乱序元素