C# 如何有条件地对两个列表的字段求和
我需要对两个列表的X和Y字段求和,但第一个Id等于第二个Id 我的代码: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;
//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
sumsXY[i].Id=i
对于每个i
。你的代码是有效的,不是吗?不知道这是否真的有效,但关键是OP改变了其中一个列表,而这仅用LINQ是不可能实现的。@Tigran:我不太确定这是否是重点。请参阅我答案的最后一段,了解它所基于的假设。