如何使用 LINQ 联接类型化列表和列表<对象>

本文关键字:列表 对象 类型化 何使用 LINQ | 更新日期: 2023-09-27 17:56:13

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列表数据是第一个索引。

如何使用 LINQ 联接类型化列表和列表<对象>

您可以使用

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无效,它可以在很多地方抛出异常或只返回 0 结果(编译器无法检查,因为所有条目都object s)。