C# 在同一列表中添加两个对象
我有一个物品清单。每个对象都包含一个ID和一个值。存在多个ID相同但值不同的对象。如何根据匹配的ID将这些值相加?此外,添加完成后,我将如何删除一个条目 所涉对象:C# 在同一列表中添加两个对象,c#,linq,C#,Linq,我有一个物品清单。每个对象都包含一个ID和一个值。存在多个ID相同但值不同的对象。如何根据匹配的ID将这些值相加?此外,添加完成后,我将如何删除一个条目 所涉对象: public class MyObject { public int ID { get; set; } public int Value { get; set; } } 下面是我从所有对象列表中获取重复对象的地方。我只是将所有重复ID放入字符串列表中,然后在duplicateObjects列表中获取整个重复对象 L
public class MyObject
{
public int ID { get; set; }
public int Value { get; set; }
}
下面是我从所有对象列表中获取重复对象的地方。我只是将所有重复ID放入字符串列表中,然后在duplicateObjects列表中获取整个重复对象
List<MyObject> myObjects = GetMyObjectsList();
List<string> duplicateIds = myObjects.GroupBy(x => x.ID)
.Where(group => group.Count() > 1)
.Select(group => group.Key).ToList();
List<MyObject> duplicateObjects = myObjects.Where(x => duplicateIds.Contains(x.ID)).ToList();
List myObjects=GetMyObjectsList();
List duplicateID=myObjects.GroupBy(x=>x.ID)
.Where(group=>group.Count()>1)
.Select(group=>group.Key).ToList();
List duplicateObjects=myObjects.Where(x=>duplicateID.Contains(x.ID)).ToList();
我陷入了最后的步骤,即添加重复值,然后删除其中一个重复值。我如何使用Linq实现这一点?我希望我正确理解了您的问题。如评论中所述,您希望对按ID分组的所有值进行“求和”,然后删除其中一个重复值。请验证以下内容是否符合您的要求
var duplicates = myObjects.GroupBy(x => x.ID)
.Select(group => new { Group = group.Count() > 1 ? group.ToList().Take(group.Count()-1) : group.ToList(),Sum=group.Count()});
输入
输出
ID = 1, Value = 5
ID = 2, Value = 6
ID = 4, Value = 4
如果需要排除非重复项,则需要包括附加的Where条件
var duplicates = myObjects.GroupBy(x => x.ID)
.Where(x=>x.Count()>1)
.Select(group => new { Group = group.Count() > 1 ? group.ToList().Take(group.Count()-1) : group.ToList(),Sum=group.Count()});
我希望我正确理解了您的问题。正如在评论中所阐明的,您希望对按ID分组的所有值进行“求和”,然后删除其中一个重复值。请验证以下内容是否符合您的要求
var duplicates = myObjects.GroupBy(x => x.ID)
.Select(group => new { Group = group.Count() > 1 ? group.ToList().Take(group.Count()-1) : group.ToList(),Sum=group.Count()});
输入
输出
ID = 1, Value = 5
ID = 2, Value = 6
ID = 4, Value = 4
如果需要排除非重复项,则需要包括附加的Where条件
var duplicates = myObjects.GroupBy(x => x.ID)
.Where(x=>x.Count()>1)
.Select(group => new { Group = group.Count() > 1 ? group.ToList().Take(group.Count()-1) : group.ToList(),Sum=group.Count()});
假设列表如下所示
var list = new MyObject[]
{
new MyObject {ID = 1, Value = 2},
new MyObject {ID = 2, Value = 2},
new MyObject {ID = 1, Value = 3},
new MyObject {ID = 4, Value = 4},
new MyObject {ID = 2, Value = 4},
};
var result = (from tm in list
group tm by tm.ID into Test
select new
{
ID = Test.Key,
Value = Test.Sum(x => x.Value)
});
然后只需从列表组中选择ID和和和值,如下所示
var list = new MyObject[]
{
new MyObject {ID = 1, Value = 2},
new MyObject {ID = 2, Value = 2},
new MyObject {ID = 1, Value = 3},
new MyObject {ID = 4, Value = 4},
new MyObject {ID = 2, Value = 4},
};
var result = (from tm in list
group tm by tm.ID into Test
select new
{
ID = Test.Key,
Value = Test.Sum(x => x.Value)
});
输出
ID = 1, Value = 5
ID = 2, Value = 6
ID = 4, Value = 4
工作小提琴假定列表如下所示
var list = new MyObject[]
{
new MyObject {ID = 1, Value = 2},
new MyObject {ID = 2, Value = 2},
new MyObject {ID = 1, Value = 3},
new MyObject {ID = 4, Value = 4},
new MyObject {ID = 2, Value = 4},
};
var result = (from tm in list
group tm by tm.ID into Test
select new
{
ID = Test.Key,
Value = Test.Sum(x => x.Value)
});
然后只需从列表组中选择ID和和和值,如下所示
var list = new MyObject[]
{
new MyObject {ID = 1, Value = 2},
new MyObject {ID = 2, Value = 2},
new MyObject {ID = 1, Value = 3},
new MyObject {ID = 4, Value = 4},
new MyObject {ID = 2, Value = 4},
};
var result = (from tm in list
group tm by tm.ID into Test
select new
{
ID = Test.Key,
Value = Test.Sum(x => x.Value)
});
输出
ID = 1, Value = 5
ID = 2, Value = 6
ID = 4, Value = 4
为了澄清,请使用fiddle——那么您想“求和”按ID分组的所有值,然后删除其中一个重复值?在什么基础上选择要删除的副本(组中的最后一项)?是的,我想根据ID求和,然后删除其中一个重复项。没有根据哪一个重复项可以删除,因为它们是相同的。为了澄清,您想“求和”所有按ID分组的值,然后删除其中一个重复项?在什么基础上选择要删除的副本(组中的最后一项)?是的,我想根据ID求和,然后删除其中一个重复项。由于复制品是相同的,所以没有删除复制品的依据。这几乎奏效了。如何在结果对象中获取附加字段?假设原始对象有一个名称,下面给出了一个错误:var result=(从列表组tm by tm.ID中的tm进入Test select new{ID=Test.Key,Value=Test.Sum(x=>x.Value),Name=Test.Name,})@Rhendar只是这样做,`Name=Test.Select(x=>x.Name).FirstOrDefault(),`我刚刚这么做了,效果非常好。非常感谢你!这几乎奏效了。如何在结果对象中获取附加字段?假设原始对象有一个名称,下面给出了一个错误:var result=(从列表组tm by tm.ID中的tm进入Test select new{ID=Test.Key,Value=Test.Sum(x=>x.Value),Name=Test.Name,})@Rhendar只是这样做,`Name=Test.Select(x=>x.Name).FirstOrDefault(),`我刚刚这么做了,效果非常好。非常感谢你!