如何使用linq连接类型列表和List <object>?

时间:2016-07-11 10:17:53

标签: c# linq

public class CoordinatePoint
{
public double x { get; set; }
public double y { get; set; }  

}

var Events = new List<CoordinatePoint>();
Events.Add(new CoordinatePoint { x = 1, y = 10 });
Events.Add(new CoordinatePoint { x = 2, y = 20 });
Events.Add(new CoordinatePoint { x = 3, y = 30 });
Events.Add(new CoordinatePoint { x = 4, y = 40 });
Events.Add(new CoordinatePoint { x = 5, y = 50 });


var Data= new List<object>();
CorridorData.Add(new object[] { 1, 11});
CorridorData.Add(new object[] { 2, 21});
CorridorData.Add(new object[] { 3, 31});
CorridorData.Add(new object[] { 4, 41});
CorridorData.Add(new object[] { 5, 51 });

我需要加入这两个列表来计算列表事件的主键为x的总和,而列表数据是第一个索引。

1 个答案:

答案 0 :(得分:2)

您可以使用LINQ.Join方法来完成您想要的任务(尽管如此,我建议您查看您的体系结构以使代码更清晰):

var result = Events.Join(
  CorridorData,
  e => (int)e.x,
  c => ((object[])c)[0],
  (e, c) => new { x = (int)e.x, data = ((object[])c)[1] });

请注意,在您的坐标点中,坐标为double类型,您在数据中添加1 int。因此,如果你想加入它们,你必须将double转换为int(反之亦然),这可能会导致你的意外行为。

更新

如果您想sum使用下一个查询:

var result = Events.Join(
  CorridorData,
  e => (int)e.x,
  c => ((object[])c)[0],
  (e, c) => new { x = (int)e.x, data = (int)((object[])c)[1] + e.y });

这将完全取决于您在评论中所写的内容:

1, 21.0
2, 41.0
3, 61.0
4, 81.0
5, 101.0

请注意,如果list无效(由于所有条目都是object s,编译器无法检查,因此有很多地方可以抛出异常或只返回0结果)。