假设我有两个Lists<myObject>
,其中myObject
由两个属性组成
ID (类型Int
)和
值(类型Double
)
我需要从这两个(匿名)对象组成的列表中找到一个列表:
Id, [Double value from List 1], [Double value from List 2]
因此,如果对于给定的Id,两个列表都包含值,则它应该如下所示:
12, 21.75, 19.87
如果一个列表不包含另一个列表中存在Id的对象,则该值应为 null :
15, null, 22.52
我怎样才能实现这一目标? 更新: 当然,我知道如何获得这样的列表,但我正在寻找最有效的方法,最好使用一些机智的Linq魔法
答案 0 :(得分:13)
不确定这是多么优化,但应该符合您的需求 - 假设我理解您的需求:
var enumerable1 = new[]
{
new {Id = "A", Value = 1.0},
new {Id = "B", Value = 2.0},
new {Id = "C", Value = 3.0},
new {Id = "D", Value = 4.0},
new {Id = "E", Value = 5.0},
};
var enumerable2 = new[]
{
new {Id = "A", Value = 6.0},
new {Id = "NOT PRESENT", Value = 542.23},
new {Id = "C", Value = 7.0},
new {Id = "D", Value = 8.0},
new {Id = "E", Value = 9.0},
};
var result = enumerable1.Join(enumerable2, arg => arg.Id, arg => arg.Id,
(first, second) => new {Id = first.Id, Value1 = first.Value, Value2 = second.Value});
foreach (var item in result)
Console.WriteLine("{0}: {1} - {2}", item.Id, item.Value1, item.Value2);
Console.ReadLine();
结果输出类似于:
A: 1 - 6
C: 3 - 7
D: 4 - 8
E: 5 - 9
不要真正理解为什么要返回空值,除非你绝对需要(另外,double是不可为空的,所以它必须是结果的组合条目,而不是)。
答案 1 :(得分:4)
要求略显不清楚。你想要一个笛卡尔积或Id上的连接吗?如果是后者,那么这应该有效:
var result = from l1 in list1
join l2 in list2
on l1.Id equals l2.Id
select new {l1.Id, Value1 = l1.Value, Value2 = l2.Value};
如果您确实想要完整的外部联接,请参阅this。
答案 2 :(得分:0)
**让我们说tempAllocationR是列表1,而tempAllocationV是List2 **
var tempAllocation = new List<Object>();
if (tempAllocationR.Count > 0 && tempAllocationV.Count > 0)
{
foreach (TempAllocation tv in tempAllocationV)
{
var rec = tempAllocationR.FirstOrDefault(tr => tr.TERR_ID == tv.TERR_ID && tr.TERR == tv.TERR && tr.Team == tv.Team);
if (rec != null)
{
rec.Vyzulta = tv.Vyzulta;
}
else
{
tempAllocationR.Add(tv);
}
}
tempAllocation = tempAllocationR;
}}