C# 循环以获取对象C中的重复项#

C# 循环以获取对象C中的重复项#,c#,asp.net,asp.net-mvc,linq,grouping,C#,Asp.net,Asp.net Mvc,Linq,Grouping,我有一个对象对象,其中一个属性可以有重复的值。我正在尝试找到一个算法来循环对象,并创建一个新的对象列表,该列表具有按重复值分组的值 如何在C中循环对象并创建新对象?我有一个视图模型,例如: pViewModel { public itemFullName {get;set;} public Item Item{get;set;} public string itemAddress {get;set;} public string itemCountry {

我有一个对象对象,其中一个属性可以有重复的值。我正在尝试找到一个算法来循环对象,并创建一个新的对象列表,该列表具有按重复值分组的值

如何在C中循环对象并创建新对象?我有一个视图模型,例如:

   pViewModel  {
    public itemFullName {get;set;}
    public Item Item{get;set;}
    public string itemAddress {get;set;}
    public string itemCountry {get;set;}
public string addressId {get;set;}
    }
    public Item{
    public int itemId{get;set;}
    }
我想在找到匹配的fullname但不同的id后创建一个新对象,这样我的新对象将有一个itemFullName、item.itemid(上一个列表中所有项目的管道分隔值)、itemaddress和itemCountry的列表

任何帮助都会很棒。多谢各位

有人指出了这一点

var itemsAndIds = list
    .GroupBy(m => m.itemFullName, m => m.Item.itemId)
    .Select(g => new {ItemFullName = g.Key, ItemIds = string.Join("|", g)})

但是现在我需要将新属性添加到此对象中

此答案可以帮助您:

假设您的示例中ItemAddress和ItemCountry始终与ItemFullName相同,这意味着您可以执行以下操作:

var itemsAndIds=list
.GroupBy(m=>new{
ItemFullName=m.ItemFullName,
ItemAddress=m.ItemAddress,
ItemCoutnry=m.itemCountry},
m=>m.Item.itemId)
.选择(g=>new{
ItemFullName=g.Key.ItemFullName,
ItemIds=string.Join(“|”,g),
ItemAddress=g.Key.ItemAddress,
ItemCoutnry=g.Key.ItemCountry})
我还建议您阅读Microsoft命名约定

属性名应该用PascalCase编写(类名也是如此)。

您可以覆盖对象中的
bool Equals(Object obj)
方法。这样,您可以按整个项目分组,然后只选择新项目。您将把比较逻辑密封在对象中,这样您就可以轻松地使用内置机制,如==比较或整个linq魔术,而无需任何破解。这样,你的课程完全符合坚实的原则

请记住,要在重写Equals时保持一致性,还需要重写
int GetHashCode()
方法。通过这种方式,您可以保持比较的一致性(精确地说,您需要确保巡演的实施遵循这三条主要规则):

  • a==a和a.Equals(a)应始终为真(自反性)
  • a==b,b==a,a.Equals(b)和b.Equals(a)应该总是给出相同的结果。(对称性)
  • 如果a==b为真,b==c为真,那么a==c也应该为真(传递性)。这同样适用于a.Equals(b)、b.Equals(c)和a.Equals(c)

分组的itemid的ItemAddress和ItemCountry是否相同或不同。如果不同,则应如何在新对象中选择它们?对于所有重复值,它们都是相同的。如果上述列表中存在不同的属性,例如addressId,如何在分组依据列表中返回逗号分隔的值?如果上述列表中存在不同的属性,例如addressId,如何使用逗号分隔的值返回分组依据列表?@user1098924您还可以在分组依据的第二部分中包含更多属性,如下所示:
m=>new{ItemId=m.Item.ItemId,AddressId=m.AddressId}
然后您必须像这样使用它们:
ItemIds=string.Join(“|”,g.Select(gs=>gs.ItemId)),AddressIds=string.Join(“|”,g.Select(gs=>gs.AddressId).Distinct()),
PS:如果您只想在单独的地址ID列表中获得不同的地址ID,请使用Distinct