我正在尝试两个比较两个列表,但是有两个参数。我要离开加入名单。
list1
[0] 1 , "cat11" , 1
[1] 2 , "cat12" , 1
[2] 3 , "cat13" , 1
[3] 4 , "cat14" , 1
[4] 5 , "cat15" , 1
[5] 6 , "cat16" , 1
[5] 1 , "cat31" , 3
[5] 1 , "cat41" , 4
list2
[0] 1 , 4
[1] 1 , 5
[2] 3 , 1
等效为
list1.codigo1 <=> list2.cod2
list1.codigo2 <=> list2.cod1
我想返回,但是我不知道如何用两个值进行比较;
[0] 4 , "cat14" , 1
[1] 5 , "cat15" , 1
[2] 1 , "cat31" , 3
答案 0 :(得分:0)
您可以使用linq在两个列表之间进行联接。像这样的东西:
// valueSet equals an array of values i.e. [1, "cat11", 1] or [5, 1]
list2.select(valueSet => list1.FirstOrDefault(
valueSet2 => valueSet2[2] == valueSet[0] &&
valueSet2[0] == valueSet[1]));
基本上,您正在使用linq select方法为list2中的每个项目从list1中“选择”一个项目。 select lambda为您提供list2的valueSet,然后使用它,以便在list1中找到第一个匹配项(第一个或默认值)并返回它。
答案 1 :(得分:0)
根据示例数据,您似乎真正想要做的是根据list1
中项目的属性值过滤 list2
中的项目,而不是比做任何类型的 join 。
如果是这种情况,则可以使用System.Linq
扩展方法Where
获得过滤的结果,该方法只能用于从list1
中选择满足以下条件的项目: list1.codigo1 == list2.cod2
和list1.codigo2 == list2.cod1
:
var filtered = list1
.Where(l1 => list2.Any(l2 => l1.codigo1 == l2.cod2 && l1.codigo2 == l2.cod1)
.ToList();
这等效于一个嵌套循环,该循环遍历第一个列表中的每个项目,然后为每个项目遍历第二个列表,寻找我们的匹配条件。如果找到匹配条件,则将第一项添加到“已过滤”列表中:
var filtered = new List<SomeType>();
foreach(SomeType l1 in list1)
{
foreach(SomeOtherType l2 in list2)
{
if (l1.codigo1 == l2.cod2 && l1.codigo2 == l2.cod1)
{
filtered.Add(l1);
break;
}
}
}
答案 2 :(得分:0)
看起来这就是您所需要的。我强烈建议您阅读this。 您可以使用此代码here。
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public class Item1
{
public int Codigo1 { get; set; }
public string Name { get; set; }
public int Codigo2 { get; set; }
}
public class Item2
{
public int Cod1 { get; set; }
public int Cod2 { get; set; }
}
public static void Main()
{
var list1 = new List<Item1>() {
new Item1() { Codigo1 = 1, Name = "cat11", Codigo2 = 1 },
new Item1() { Codigo1 = 2, Name = "cat12", Codigo2 = 1 },
new Item1() { Codigo1 = 3, Name = "cat13", Codigo2 = 1 },
new Item1() { Codigo1 = 4, Name = "cat14", Codigo2 = 1 },
new Item1() { Codigo1 = 5, Name = "cat15", Codigo2 = 1 },
new Item1() { Codigo1 = 6, Name = "cat16", Codigo2 = 1 },
new Item1() { Codigo1 = 1, Name = "cat31", Codigo2 = 3 },
new Item1() { Codigo1 = 1, Name = "cat41", Codigo2 = 4 }
};
var list2 = new List<Item2>() {
new Item2() { Cod1 = 1, Cod2 = 4 },
new Item2() { Cod1 = 1, Cod2 = 5 },
new Item2() { Cod1 = 3, Cod2 = 1 }
};
var result = from l1 in list1
join l2 in list2
on new { a = l1.Codigo1, b = l1.Codigo2 } equals new { a= l2.Cod2, b= l2.Cod1 }
select new { Codigo1 = l1.Codigo1, Name = l1.Name, Codigo2 = l1.Codigo2 };
foreach(var r in result)
{
Console.WriteLine(r.Codigo1 + " " + r.Name + " " + r.Codigo2);
}
}
}
预期结果
4 cat14 1
5 cat15 1
1 cat31 3