C# 如何有条件地对两个列表的字段求和

C# 如何有条件地对两个列表的字段求和,c#,.net,C#,.net,我需要对两个列表的X和Y字段求和,但第一个Id等于第二个Id 我的代码: //Program.cs //(...) class Point { public int Id { get; set; } public int X { get; set; } public int Y { get; set; } public Point(int _Id, int _X, int _Y) { Id = _Id; X = _X;

我需要对两个列表的X和Y字段求和,但第一个Id等于第二个Id

我的代码:

//Program.cs

//(...)

class Point
{
    public int Id { get; set; }
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int _Id, int _X, int _Y)
    {
        Id = _Id;
        X = _X;
        Y = _Y;
    }
}

//(...)

List<Point> points = new List<Point>();
List<Point> sumsXY = new List<Point>();

//sum the X and Y of two lists, but points.Id must equal to sumsXY.Id
for (int i = 0; i < objcount; i++)
{
    sumsXY[points[i].Id].X = sumsXY[points[i].Id].X + points[i].X;
    sumsXY[points[i].Id].Y = sumsXY[points[i].Id].Y + points[i].Y;
}
//Program.cs
//(...)
类点
{
公共int Id{get;set;}
公共整数X{get;set;}
公共整数Y{get;set;}
公共点(整数Id、整数X、整数Y)
{
Id=_Id;
X=X;
Y=_Y;
}
}
//(...)
列表点=新列表();
List sumsXY=新列表();
//两个列表的X和Y之和,但points.Id必须等于sumsXY.Id
for(int i=0;i
我需要帮助


大卫

你在找这样的东西吗

var sumsXY = points.GroupBy(x => x.Id)
                   .Select(g => new Point(g.Key, g.Sum(x => x.X),
                                          g.Sum(x => x.Y)))
                   .ToList();
这会将具有相同ID的所有点组合在一起,并使用该组的ID和组中所有点的X和Y值之和为每个组创建一个新点

此答案假设此操作开始时
sumsXY
为空。如果不是这样,您可能希望澄清您的问题,并提供示例输入和预期输出。

List newList=newList();
List<Point> newList = new List<Point>();
foreach(Point p in points)
{
  Point sumsXYPoint = sumsXY.FirstOrDefault(sums => sums.Id == p.Id);
  if (sumsXYPoint != null)
  {
    newList.Add(new Point() { Id = p.Id, X = sumsXYPoint.X + p.X, Y = sumsXYPoint.Y + p.Y);
  }
}
foreach(点中的点p) { 点sumsXYPoint=sumsXY.FirstOrDefault(sums=>sums.Id==p.Id); if(sumsXYPoint!=null) { 添加(newpoint(){Id=p.Id,X=sumsXYPoint.X+p.X,Y=sumsXYPoint.Y+p.Y); } }
为您做类似的工作:

List<Point> points = new List<Point>();
List<Point> sumsXY = new List<Point>();

points.Add(new Point(1, 10, 10));
points.Add(new Point(2, 10, 20));
points.Add(new Point(3, 10, 30));

sumsXY.Add(new Point(1, 100, 100));
sumsXY.Add(new Point(5, 10, 20));
sumsXY.Add(new Point(6, 10, 30));

foreach (Point p in points)
{
     foreach (Point s in sumsXY)
     {
         if (s.Id == p.Id)
         {
             s.X += p.X;
             s.Y += p.Y;
         }
     }
 }
列表点=新列表();
List sumsXY=新列表();
增加(新的第(1、10、10)点);
增加(新的第(2、10、20)点);
增加(新的第(3、10、30)点);
添加(新点(1100100));
添加(新的点(5,10,20));
添加(新的点(6,10,30));
foreach(点中的点p)
{
foreach(sumsXY中的点s)
{
如果(s.Id==p.Id)
{
s、 X+=p.X;
s、 Y+=p.Y;
}
}
}
给出:

  • 110 110
  • 1020
  • 1030

第二个列表中有几个点对应第一个列表中的单个点吗?@David如果设置,
sumsXY[i].Id=i
对于每个
i
。你的代码是有效的,不是吗?不知道这是否真的有效,但关键是OP改变了其中一个列表,而这仅用LINQ是不可能实现的。@Tigran:我不太确定这是否是重点。请参阅我答案的最后一段,了解它所基于的假设。