【问题标题】:Compare List and return matches in c#在 C# 中比较列表并返回匹配项
【发布时间】:2013-05-08 07:37:11
【问题描述】:

比较 2 个列表并返回匹配项的最快和最佳方法是什么。 只有一场比赛是可能的。 List1 包含来自数据库的动态数据。

我现在的做法:

foreach (var item1 in List1)
{
   foreach (var item2 in List2 )
   {
       if(item2 == item1)
       string match = item1;
   }
}

我感觉它可以做得更快。

【问题讨论】:

    标签: c# list compare match


    【解决方案1】:

    使用Enumerable.Intersect

    var matchItem = List1.Intersect(List2).First();
    

    不确定它比您当前的代码快多少,您可以使用秒表来测量它。但是在您当前的代码中,您应该在找到匹配项时打破您的内部和外部循环。比如:

    foreach (var item1 in List1)
    {
        string match = null;
        foreach (var item2 in List2)
        {
            if (item2 == item1)
            {
                match = item1;
                break;
            }
        }
        if (match != null)
            break;
    }
    

    【讨论】:

    • @Habib,它更快还是更简洁?我的意思是它在内部会做同样的事情吗?
    • @tariq,是的,它在内部进行循环,我不确定它是否更快,这就是为什么我为另一个选项提供了问题中修改后的代码。
    • 平均而言,Linq 会变慢,因为即使找到匹配项,它也会继续迭代。第二个代码示例将是最快的。
    • @MatthewWatson,是的,这是正确的,因为Intersect 将首先收集所有相交元素,然后应用First
    • 这不是尽可能快。它在外循环内对match != null 进行了额外的比较。如果您只是从内部循环返回,您将避免在外部循环的每次迭代中在外部循环中进行比较。 (例如,请参阅我的回答。)鉴于问题要求“最快的方式”,这并不是最快的。
    【解决方案2】:

    您有很多方法可以做到这一点。这主要取决于您尝试匹配的数据。

    • 您可以做的第一件事是拥有一个排序列表
    • 如果您知道列表的中间值,您可以从头到尾遍历列表
    • 但大多数情况下只是返回您找到的价值

    前 2 点也仅在您的列表具有可以用来识别项目的数值时才有效。

    你可以做的第一个优化是:

    Foreach (var item1 in List1)
    {
       Foreach (var item2 in List2 )
       {
           if(item2 == item1) return item1;
       }
    }
    

    如果您确实需要此例程非常快,则必须根据列表中的数据进行优化。

    此外,如果您的数据在两个列表中都是 string,您可以为每个字符串 (string.GetHashCode) 生成一个哈希码,然后依靠哈希码在您的列表中进行排序和搜索。

    还有很多其他的方法,但这一切都取决于:

    • 列表中的数据量(如果您只有 100 个元素,您不会看到很多性能提升)
    • 如果您的列表是静态的还是动态的
    • 如果它们是动态的,它们多久可以更改一次
    • 您多久在这些列表中进行一次搜索
    • ...

    【讨论】:

      【解决方案3】:

      当您找到任何匹配项时,您可以将循环短路。然后,您可以使用返回匹配项的方法,如果没有匹配项则返回 null(假设元素是引用类型):

      foreach (var item1 in List1)
          foreach (var item2 in List2)
              if (item2 == item1)
                  return item1;
      
      return null;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 2010-11-26
        • 1970-01-01
        • 2021-09-19
        • 2020-02-08
        • 2016-12-23
        • 1970-01-01
        相关资源
        最近更新 更多