2014-09-18 4 views
0

J'essaie d'utiliser la méthode Group By soutenue par LINQ.Comment regrouper par enregistrements dans C#

Je cette classe

public class Attribute 
{ 
    public int Id {get;set;} 

    public string Name {get;set;} 

    public string Value {get;set;} 

} 

J'ai une méthode de service qui retrive un IList

var attributes = _service.GetAll(); 
Id Name Value 
7 Color Black 
7 Color White 
220 Size 16 

Maintenant j'ai une autre classe de remorquage

un est

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

Je suis essayer de faire une boucle dans la liste des attributs. et si l'attribut id est le même, je veux insérer les enregistrements où id = à cet id dans le AttributeValueResourceModelSubItem dans lequel id = 1 et Name sera égal à la valeur de l'attribut.

Ce que j'ai obtenu jusqu'ici.

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

Toute aide est appréciée.

+1

D'où vient 'values' dans' attributeResourceModelSubItem.values.Add'? – pushpraj

+0

En fait, je dois ajouter l'attribut values ​​dans la classe AttributeResourceModelSubItem. Je vais le modifier. – user123456

+1

'new IList ();'? –

Répondre

1

Il est assez difficile de voir ce que vous essayez de faire, mais c'est l'essentiel.

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

Vous devriez aussi certainement pas utiliser le mot Attribute comme un nom de classe. C'est déjà une classe .NET.

Je vais admettre que je ne comprends pas bien la partie id = 1, mais j'ai pris cela à partir de votre code. Il semble également étrange de grouper par le id alors essayez et prenez le premier name, mais encore une fois c'est ce que vous avez.

Si vous voulez, en fait, regrouper par son nom et prendre le id, ce qui est un peu plus logique, vous voudrez échanger quelques choses. Certes, cette structure me semble encore un peu étrange, mais j'espère que cela vous rapprochera de votre objectif.

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

J'ai aussi fait votre id = 1 incrément à partir de l'un pour chaque élément dans chaque liste values. Vous voudrez peut-être que ce soit item.Id, ou même simplement votre original 1.

+0

Merci – user123456

+0

@Mohammadjouhari at-il répondu à votre question? –

+0

Oui, il a fait l'homme .. merci beaucoup – user123456

Questions connexes