您能告诉我这些列表连接方法中哪一种更有效吗?为什么?或者在性能方面是否相同?有没有其他方法可以解决这种情况(根据字段属性加入 2 个列表)?
我的代码:
public List<CombinedDatabaseStructure> Combine1(List<DatabaseStructure1> _Data1, List<DatabaseStructure2> _Data2)
{
List<CombinedDatabaseStructure> combinedAll = new List<CombinedDatabaseStructure>();
foreach (var row1 in _Data1)
{
foreach (var row2 in _Data2)
{
CombinedDatabaseStructure combined = new CombinedDatabaseStructure();
if (row1.ID == row2.ID)
{
combined.DatabaseStructure1 = row1;
combined.DatabaseStructure2 = row2;
combinedAll.Add(combined);
}
}
}
return combinedAll;
}
代码2:
public List<CombinedDatabaseStructure> Combine2(List<DatabaseStructure1> _Data1, List<DatabaseStructure2> _Data2)
{
var joined = from item1 in _Data1.AsEnumerable()
join item2 in _Data2.AsEnumerable() on item1.ID equals item2.ID
select new CombinedDatabaseStructure (item1,item2);
return joined.ToList<CombinedDatabaseStructure>();
}
最佳答案
作为一般规则:如果 .NET 框架中有一个内置方法可以完全满足您的需求,通常最好使用它而不是重新实现它。它更容易、更易读、更不容易出错、测试更好,而且通常实现起来更有效。
让我们详细看看您的特定问题:
选项 1 基本上是复杂度为 O(n*m)
的嵌套循环连接的手动(简单)实现。
选项 2 使用 LINQ-to-object 的 join
实现,internally uses a hash join ,其复杂度为 O(n+m)
。
如果您担心效率,我推荐“选项 3”:让数据库执行连接。它可以使用统计信息为您的数据选择最佳连接策略。
注意:您的嵌套循环实现效率非常低。它可以通过使用某种索引查找来查找匹配的 Data2 行而不是内部循环,以 O(n*log(m))
的复杂性来实现。在那种情况下,嵌套循环连接可以比散列连接更快,if n
is very small and m
is large .然而,这假定索引已经存在,因为创建索引(例如,通过从列表创建 C# 字典)本身就是一个 O(m)
操作。
关于c# - 在公共(public)字段上加入 C# 中的两个列表的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44908585/