繁体   English   中英

在C#中相交两个列表

[英]Intersect Two Lists in 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。

您需要首先对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); };

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,则在最后一行将结果( 仅result )转换回int。

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

var ids = list1.Select(x => x.Id).Intersect(list2.Select(x => x.Id));
var result = list1.Where(x => ids.Contains(x.Id));
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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM