c# - 在公共(public)字段上加入 C# 中的两个列表的最有效方法是什么?

标签 c# linq

您能告诉我这些列表连接方法中哪一种更有效吗?为什么?或者在性能方面是否相同?有没有其他方法可以解决这种情况(根据字段属性加入 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/

相关文章:

Linq 和 SubSonic - 返回嵌套的复杂类型

c# - LINQ Take()一遍又一遍地返回相同的结果

c# - 在数据表列表中查找相交的数据行

c# - Windows 8.1 通用应用程序中的 BackgroundWorker 的替代方案是什么?

c# - SetWindowPos 每次将窗口移动到不同的位置

c# - Gridview 日期格式

c# - 获取具有相同服务器 ID 的多用户控件的 clientID

c# - 无法将类型 'System.Decimal' 的对象强制转换为类型 'System.String'

c# - 是否可以(以编程方式)证明两个 LINQ 查询相等?

c# - 按总数分组