在C#中交叉两个列表

时间:2011-08-25 09:27:56

标签: c# intersection

我有两个清单:

  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

4 个答案:

答案 0 :(得分:66)

您需要先在每个元素上调用ToString()来转换data1。

如果要返回字符串,请使用此选项。

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 :(得分:7)

效果点视图中,如果两个列表包含显着不同的元素数量,您可以尝试这种方法(使用条件运算符?:):

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个元素(或相反,则无关紧要),想象一下执行速度; - )

如果您希望将结果作为List,则在最后一行中将结果(仅结果)转换回int。

答案 2 :(得分:3)

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

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

答案 3 :(得分:-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();


}