【问题标题】:Intersect Two Lists in C#C#中的两个列表相交
【发布时间】:2011-11-03 12:26:27
【问题描述】:

我有两个列表:

  List<int> data1 = new List<int> {1,2,3,4,5};
  List<string> data2 = new List<string>{"6","3"};

我想做类似的事情

var newData = data1.intersect(data2, lambda expression);

如果data1[index].ToString() == data2[index],则 lambda 表达式应返回 true

【问题讨论】:

  • @JoshuaDrake 我不认为这是重复的;该问题不考虑使用 lambda 自定义确定相等性。
  • @ValekHalfHeart 我可能应该注意到它是相关的,我不知何故错过了这个问题中数据类型的差异。

标签: c# intersection


【解决方案1】:

您需要首先转换 data1,在您的情况下,通过在每个元素上调用 ToString()

如果您想返回字符串,请使用它。

List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"6","3"};

var newData = data1.Select(i => i.ToString()).Intersect(data2);

如果您想返回整数,请使用它。

List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"6","3"};

var newData = data1.Intersect(data2.Select(s => int.Parse(s));

请注意,如果不是所有字符串都是数字,这将引发异常。所以你可以先做以下检查:

int temp;
if(data2.All(s => int.TryParse(s, out temp)))
{
    // All data2 strings are int's
}

【讨论】:

    【解决方案2】:

    如果你有对象,而不是结构(或字符串),那么你必须先与它们的键相交,然后通过这些键选择对象:

    var ids = list1.Select(x => x.Id).Intersect(list2.Select(x => x.Id));
    var result = list1.Where(x => ids.Contains(x.Id));
    

    【讨论】:

    • 好答案。简单
    【解决方案3】:

    性能的角度来看,如果两个列表包含显着不同的元素数量,您可以尝试这种方法(使用条件运算符?:):

    1.首先需要声明一个转换器:

    Converter<string, int> del = delegate(string s) { return Int32.Parse(s); };
    

    2.然后你使用条件运算符:

    var r = data1.Count > data2.Count ?
     data2.ConvertAll<int>(del).Intersect(data1) :
     data1.Select(v => v.ToString()).Intersect(data2).ToList<string>().ConvertAll<int>(del);
    

    您转换较短列表的元素以匹配较长列表的类型。想象一下执行速度,如果您的第一个集合包含 1000 个元素,而第二个元素只有 10 个(或相反,没关系);-)

    由于您希望将结果作为列表,因此在最后一行将结果(仅结果)转换回 int。

    【讨论】:

      【解决方案4】:
      public static List<T> ListCompare<T>(List<T> List1 , List<T> List2 , string key )
      {
          return List1.Select(t => t.GetType().GetProperty(key).GetValue(t))
                      .Intersect(List2.Select(t => t.GetType().GetProperty(key).GetValue(t))).ToList();
      }
      

      【讨论】:

      • 请提供适当的解释以及代码。即使是代码中的 cmets 也可以工作。另外,请理解代码样式可以提高答案的可读性。如果您碰巧将代码限制为每行 80 个字符,则答案将不需要滚动。此外,您的答案有一长串函数调用,可以在代码中解释以便更好地理解。
      • 为什么还要使用反射?我们知道列表类型。特别是我们知道 every 元素的类型,它可以是整数或字符串。通过反射查询列表中每个元素的值纯粹是矫枉过正,并且使这个问题变得过于复杂。
      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多