如何有条件地求和两个列表的字段
本文关键字:两个 列表 字段 有条件 求和 | 更新日期: 2023-09-27 18:24:35
我需要对两个列表的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;
}
需要帮助。
David
你在找这样的东西吗?
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<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);
}
}
这样做对你有用吗:
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;
}
}
}
提供:
- 110 110
- 10 20
- 10 30