C# 如何在c中按记录分组#

C# 如何在c中按记录分组#,c#,C#,我正在尝试使用LINQ支持的GROUPBY方法 我有这门课 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 C

我正在尝试使用LINQ支持的GROUPBY方法

我有这门课

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;}
}
公共类AttributeResourceModelSubItem
{
公共字符串名称{get;set;}
公共列表值{get;set;}
}
公共类AttributeValueResourceModelSubItem
{
公共int Id;
公共字符串名称{get;set;}
}
我正在尝试循环浏览属性列表。如果属性id相同,我想在AttributeValueResourceModelSubItem中插入id=指向该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;
}
私有IList格式属性(IList属性)
{
Dictionary baseTypes=newdictionary();
AttributeResourceModelSubItem AttributeResourceModelSubItem=null;
var list=new IList();
foreach(属性中的变量项)
{
如果(!baseTypes.ContainsKey(item.Id))
{
attributeResourceModelSubItem=新的attributeResourceModelSubItem()
attributeResourceModelSubItem.key=item.Name;
attributeResourceModelSubItem.values.Add(新的AttributeValueResourceModelSubItem()
{
id=1,
name=item.Value
});
list.Add(attributeResourceModel子项);
}
添加(item.Id,item);
}
退货清单;
}

感谢您的帮助

从你的例子中不清楚你到底想做什么,但这就是我得到的要点

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();
                                  });
}

我还使您的
id=1
从每个
列表中的每个元素的1开始递增。您可能希望它是
item.Id
,或者甚至只是您原始的
1

attributeResourceModelSubItem.values.Add
中的
values
从何而来?实际上,我需要在attributeResourceModelSubItem类中添加values属性。我将修改它。
new IList()?另外,如果(!baseTypes.ContainsKey(item.Id))
,那么不管结果如何,您都在添加带有该键的项。这很有可能会给你一个运行时错误。所有这一切只是初始化一个数据结构。GROUP BY的代码在哪里?你想让别人帮你写吗?@Mohammadjouhari回答你的问题了吗?@Mohammadjouhari真棒。请将此答案标记为已接受,以便将来可能对用户提出类似问题有所帮助。
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();
                                  });
}