C # 中的两个列表相交

我有两份名单:

  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

162875 次浏览

您需要首先转换 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
}

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

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

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

然后使用条件运算符:

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个(或相反,因为它没有关系) ; -)

因为您希望将结果作为 List,所以在最后一行中将结果(唯一的结果)转换回 int。

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();
}

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

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