C# 在C中相交两个列表#

C# 在C中相交两个列表#,c#,intersection,C#,Intersection,我有两份清单: List<int> data1 = new List<int> {1,2,3,4,5}; List<string> data2 = new List<string>{"6","3"}; 如果data1[index].ToString()==data2[index]则lambda表达式应返回true。在本例中,您需要首先对每个元素调用ToString() 如果要返回字符串,请使用此选项。 从性能的角度来看,如果两个列表包含的

我有两份清单:

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

如果
data1[index].ToString()==data2[index]
则lambda表达式应返回true。在本例中,您需要首先对每个元素调用
ToString()

如果要返回字符串,请使用此选项。
从性能的角度来看,如果两个列表包含的元素数量有显著差异,您可以尝试这种方法(使用条件运算符?:):

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

Converter<string, int> del = delegate(string s) { return Int32.Parse(s); };
Converter del=delegate(字符串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);
var r=data1.Count>data2.Count?
data2.ConvertAll(del).Intersect(data1):
data1.Select(v=>v.ToString()).Intersect(data2.ToList().ConvertAll(del);
您可以转换较短列表的元素以匹配较长列表的类型。想象一下,如果第一个集合包含1000个元素,而第二个集合只包含10个元素,那么执行速度会是,;-)

当您想将结果作为列表时,在最后一行将结果(仅结果)转换回int.

公共静态列表列表比较(列表列表1、列表2、字符串键)
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();
}
{ 返回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));

可能是@JoshuaDrake的复制品我不认为它是复制品;这个问题不考虑使用lambda进行自定义的平等。@ ValeCalp真心我可能应该注意到它是相关的,我在某种程度上忽略了这个问题中数据类型的不同。请提供适当的解释和代码。即使是代码中的注释也会起作用。另外,请理解代码样式可以提高答案的可读性。如果您碰巧将代码限制为每行80个字符,那么答案将不需要滚动。另外,您的答案有一长串函数调用,可以用代码解释,以便更好地理解。为什么还要使用反射呢?我们知道列表类型。特别是我们知道每个元素的类型,可以是整数或字符串。通过反射来查询列表中每个元素的值纯粹是过火了,这会使这个问题变得非常复杂。回答得好。简单的
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);
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));