【问题标题】:How to logical and (^ , logical conjunction) string lists - C#如何逻辑和(^,逻辑合取)字符串列表 - C#
【发布时间】:2012-02-23 00:21:13
【问题描述】:

好的。现在这个问题可能对你来说很奇怪,但我必须解决它。现在问题很简单。让我用好例子来解释

假设我有以下字符串列表。每行都是一个列表,这些列表将是逻辑与

my,car,fly,surf,buy
house,home,car,fly,buy
fly,king,rock,buy,sell
fly,buy,home,rock,sell

好吧,如果你在逻辑上和上面列出的结果将是

fly,buy

因为这两个是这些列表中唯一相同的元素。现在如何使用 C# 4.0 实现这种最快的运行时间方式?谢谢

c# , c#-4.0

【问题讨论】:

  • 运行时最快,还是开发时间最快?另外,我建议不要优化运行时,直到你有一个正确的解决方案。 [在此处插入强制性的 Knuth 报价]
  • 现在是最快的运行时间而不是开发时间。谢谢你。虽然我仍然想听听最快的开发时间方法:)

标签: c# string list compare logical-operators


【解决方案1】:

您可以使用 LINQ 提供的Intersect 方法。例如:

List<string> a = new List<string>() {"my","car","fly","surf","buy"};
List<string> b = new List<string>() {"house","home","car","fly","buy" };

var c = a.Intersect(b);

提供汽车、飞行和购买。对其余字符串重复 c 上的交叉点以获得完整的交叉点。

【讨论】:

    【解决方案2】:

    你可以使用HashSet&lt;T&gt;:

    IEnumerable<T> IntersectAll(IEnumerable<T> lists)
    {
        var set = new HashSet<T>(lists.First());
    
        foreach (var other in lists.Skip(1))
        {
            set.IntersectWith(other);
        }
    
        return set;
    }
    

    【讨论】:

    • 我认为这是最好和最容易实施的解决方案 :) 感谢您的回答。
    【解决方案3】:
    List<List<string>> lists = //whatever
    HashSet<string> set = new HashSet<string>(lists[0]);
    
    for(int i = 1; i < lists.Count; i++)
    {
        set.IntersectWith(lists[i]);
    }
    

    使用 linq 你可以使用:

    var intersection = lists.Aggregate((l1, l2) => l1.Intersect(l2).ToList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2013-11-16
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      相关资源
      最近更新 更多