Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在同一列表中添加两个对象_C#_Linq - Fatal编程技术网

C# 在同一列表中添加两个对象

C# 在同一列表中添加两个对象,c#,linq,C#,Linq,我有一个物品清单。每个对象都包含一个ID和一个值。存在多个ID相同但值不同的对象。如何根据匹配的ID将这些值相加?此外,添加完成后,我将如何删除一个条目 所涉对象: public class MyObject { public int ID { get; set; } public int Value { get; set; } } 下面是我从所有对象列表中获取重复对象的地方。我只是将所有重复ID放入字符串列表中,然后在duplicateObjects列表中获取整个重复对象 L

我有一个物品清单。每个对象都包含一个ID和一个值。存在多个ID相同但值不同的对象。如何根据匹配的ID将这些值相加?此外,添加完成后,我将如何删除一个条目

所涉对象:

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(),`我刚刚这么做了,效果非常好。非常感谢你!