287 votes

Comment obtenir des valeurs d'IGrouping

J'ai une question sur IGrouping et le Select() méthode.

Disons que j'ai un IEnumerable<IGrouping<int, smth>> de cette façon :

var groups = list.GroupBy(x => x.ID);

list est un List<smth> .

Et maintenant je dois passer les valeurs de chaque IGrouping à une autre liste d'une manière ou d'une autre :

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}

Quelqu'un peut-il suggérer comment obtenir les valeurs ( List<smth> ) d'un IGrouping<int, smth> dans un tel contexte ?

0 votes

L'ID est généralement un champ d'identité qui doit être unique, ce qui rendrait le regroupement par ce champ inutile. Si vous essayez simplement de supprimer les données en double, essayez plutôt Distinct(). Si c'était list.GroupBy(x => x.SubID), il serait logique d'utiliser le regroupement, mais dans ce cas, vous voudriez probablement conserver le regroupement et foreach(var grp in groups){grp.ToList() ; } le ferait.

3voto

Kim Homann Points 1471

Si vous avez un IGrouping<GroupItem, ListItem> et vous voulez accéder aux éléments de type ListItem de ce groupe sans utiliser un foreach loop, c'est très simple. L'objet de type IGrouping<GroupItem, ListItem> est de type IEnumerable<ListItem> également, puisqu'il est défini comme suit :

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable

Donc vous pouvez simplement dire :

foreach (IGrouping<GroupItem, ListItem> group in list.GroupBy(x => x.ID))
{
    IEnumerable<ListItem> itemsInThisGroup = group;
    // ...
}

Si pour une raison quelconque, il a pour être un List<T> au lieu d'un IEnumerable<T> vous pouvez bien sûr toujours appeler itemsInThisGroup.ToList() . Mais en général, il vaut mieux ne pas le faire si ce n'est pas nécessaire.

-1voto

Daniel N. Points 1

Faites simplement ceci :

// this will "split" the list into groups
var groups = list.GroupBy(x => x.ID);

// groups is a "collection of lists"
foreach (var sublist in groups)
{
  // now the sublist is only a part of the original list
  // to get which is the value of ID, you can use sublist.Key
}

Vous n'avez pas besoin Select().GroupBy(expr) fait "une liste de listes", en quelque sorte.

-2voto

ayberk101 Points 41

Supposons que vous ayez la classe MyPayments comme suit

 public class Mypayment
{
    public int year { get; set; }
    public string month { get; set; }
    public string price { get; set; }
    public bool ispaid { get; set; }
}

et vous avez une liste de MyPayments

public List<Mypayment> mypayments { get; set; }

et vous voulez regrouper la liste par année. Vous pouvez utiliser linq comme ceci :

List<List<Mypayment>> mypayments = (from IGrouping<int, Mypayment> item in yearGroup
                                                let mypayments1 = (from _payment in UserProjects.mypayments
                                                                   where _payment.year == item.Key
                                                                   select _payment).ToList()
                                                select mypayments1).ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X