我正在尝试使用LINQ支持的Group By方法。
我有这个班级
public class Attribute
{
public int Id {get;set;}
public string Name {get;set;}
public string Value {get;set;}
}
我有一个服务方法可以检索IList
var attributes = _service.GetAll();
Id Name Value
7 Color Black
7 Color White
220 Size 16
现在我有另外两个班级
一个是
public class AttributeResourceModelSubItem
{
public string Name {get;set;}
public List<AttributeValueResourceModelSubItem> values { get; set; }
}
public class AttributeValueResourceModelSubItem
{
public int Id;
public string Name {get;set;}
}
我正在尝试遍历属性列表。如果属性id相同,我想在AttributeValueResourceModelSubItem中插入id = to id的记录,其中id = 1,Name将等于属性值。
这是我到目前为止所得到的。
private IList<AttributeResourceModelSubItem> FormatAttributes(IList<Attribute> attributes)
{
Dictionary<int, Attribute> baseTypes = new Dictionary<int, Attribute>();
AttributeResourceModelSubItem attributeResourceModelSubItem = null;
var list = new IList<AttributeResourceModelSubItem>();
foreach (var item in attributes)
{
if (!baseTypes.ContainsKey(item.Id))
{
attributeResourceModelSubItem = new AttributeResourceModelSubItem()
attributeResourceModelSubItem.key = item.Name;
attributeResourceModelSubItem.values.Add(new AttributeValueResourceModelSubItem()
{
id = 1,
name = item.Value
});
list.Add(attributeResourceModelSubItem);
}
baseTypes.Add(item.Id, item);
}
return list;
}
感谢任何帮助。
答案 0 :(得分:1)
从你的例子中我很不清楚你实际上想要做什么,但这是我得到的要点。
private IEnumerable<AttributeResourceModelSubItem> FormatAttributes(IEnumerable<Attribute> attributes)
{
return attributes.GroupBy(c => c.Id)
.Select(c => new AttributeResourceModelSubItem()
{
key = c.First().Name,
values = c.Select(x => new AttributeValueResourceModelSubItem()
{
id = 1,
name = x.value
}).ToList();
});
}
您还应该不使用单词Attribute
作为班级名称。那已经是.NET类了。
我承认我并不完全理解id = 1
部分,但我从你的代码中接受了这一点。按id
分组似乎很奇怪,然后尝试拍摄第一个name
,但这又是你所拥有的。
如果你这样做,事实上,想要按名称分组并选择id
,这会更有意义,你会想要交换一些东西。不可否认,这个结构对我来说似乎有点奇怪,但希望这会让你离你的目标更近一步。
private IEnumerable<AttributeResourceModelSubItem> FormatAttributes(IEnumerable<Attribute> attributes)
{
return attributes.GroupBy(c => c.name)
.Select(c => new AttributeResourceModelSubItem()
{
key = c.Key,
values = c.Select((item, index) => new AttributeValueResourceModelSubItem()
{
id = index + 1,
name = item.value
}).ToList();
});
}
我还为每个id = 1
列表中的每个元素从{1}}开始增加。您可能希望它为values
,甚至只是原始的item.Id
。