在C#中交叉两个列表

Mer*_*rni 46 c# intersection

我有两个清单:

  List<int> data1 = new List<int> {1,2,3,4,5};
  List<string> data2 = new List<string>{"6","3"};
Run Code Online (Sandbox Code Playgroud)

我想做类似的事情

var newData = data1.intersect(data2, lambda expression);
Run Code Online (Sandbox Code Playgroud)

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

Geo*_*ett 68

您需要首先通过调用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);
Run Code Online (Sandbox Code Playgroud)

如果要返回整数,请使用此选项.

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));
Run Code Online (Sandbox Code Playgroud)

请注意,如果并非所有字符串都是数字,则会抛出异常.所以你可以先做以下检查:

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


ale*_*sky 10

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

var ids = list1.Select(x => x.Id).Intersect(list2.Select(x => x.Id));
var result = list1.Where(x => ids.Contains(x.Id));
Run Code Online (Sandbox Code Playgroud)


Sla*_*huk 7

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

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

Converter<string, int> del = delegate(string s) { return Int32.Parse(s); };
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

您可以转换较短列表的元素以匹配较长列表的类型.想象一下如果你的第一组包含1000个元素而第二个只有10个(或者相反,因为它无关紧要)的执行速度 ;-)

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