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

时间:2019-07-18 10:20:51

标签: 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 {get;set;}
}
public Item{
public int itemId{get;set;}
}

我想在找到匹配的全名但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)})

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

2 个答案:

答案 0 :(得分:1)

此答案可以帮助您: https://stackoverflow.com/a/5232194/1341189

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

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

我还建议您阅读Microsoft命名约定。

属性名称应使用PascalCase编写(类名称也是如此)。 https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members

答案 1 :(得分:0)

您可以在对象中覆盖bool Equals(Object obj)方法。这样,您可以按整个项目分组,然后选择新的项目。您将比较逻辑密封在对象中,可以轻松地使用==比较或linq魔术之类的内置机制,而无需任何技巧。这样,您的课程就完全与SOLID原理兼容<​​/ p>

请记住,如果您重写Equals来保持一致性,那么也值得重写int GetHashCode()方法。这样,您可以保持比较的一致性(确切地说,您需要确保游览实现遵循这三个主要规则):

  • a == a和a.Equals(a)应始终为true(自反)。
  • 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)。