我有一个对象的对象,其中一个属性可以具有重复的值,我试图找到一种算法来遍历该对象,并创建一个具有重复值分组的对象的新列表。
我如何遍历一个对象并在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)})
但是现在我需要将新属性添加到该对象
答案 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()
方法。这样,您可以保持比较的一致性(确切地说,您需要确保游览实现遵循这三个主要规则):