如何按c#中的记录分组

时间:2014-09-18 01:16:33

标签: c#

我正在尝试使用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;
}

感谢任何帮助。

1 个答案:

答案 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