C# trouver tous les Éléments d'une Liste<Item>
Disons que nous avons un List<Product>
et chaque élément de la liste a de nombreux List<Type>
public class Product{
public int Id {get:set;}
public string Name {get:set;}
public List<Type> Types {get;set;}
}
public class Type{
public int Id {get;set;}
public string Name{get;set;}
}
Après j'ai créer une liste de produits, j'ai besoin de les regrouper par type et ensuite trouver tous les appartient à chaque type. Je pense que je devrais essayer LINQ
pour cela. Voici ce que j'ai fait jusqu'à présent, mais ne semble pas la bonne façon de faire le travail. Peut-être quelqu'un peut m'aider.
var productsList = new List<Product>();
//Adding products and types for each of them
var productTypesList = new Dictionary<int, string>();
foreach (var p in productsList)
{
var pTypes = p.Types;
foreach (var ptype in
pTypes.Where(x=> !productTypesList .ContainsKey(x.Id)))
{
productTypesList.Add(ptype.Id, ptype.Name);
}
}
Alors j'essaie de recherche Comme cette
foreach (var t in productTypesList)
{
var matches = productsList.FindAll(........);
//from here I need to find all the product which belongs to type (t.id)
if (matches.Count > 0)
{
//Do somthing here
}
}
OriginalL'auteur randika | 2011-07-03
Vous devez vous connecter pour publier un commentaire.
La suite fait ce que vous voulez:
D'abord, vous faites un
SelectMany
pour obtenir une liste de tous les types à l'intérieur de la produits. Pour chaque type de vous rappeler le type id et le produit correspondant:Chaque
t
est maintenant un objet anonyme contenant un id de type et d'un produit. Ensuite, vous groupe de ces objets par type id. Maintenant, nous avons un groupe de produits pour chaque type id.Pour vous donner un exemple, supposons que vous disposez de la suite de produits et types de produits:
La
SelectMany
donne le résultat intermédiaire:Nous groupe ce résultat par type de id ainsi, nous avons obtenu les groupes suivants:
Et c'est le résultat que tu voulais.
Je suis content que nous avons pu aider 🙂 Vous pouvez seulement de marquer une seule réponse, mais je pense que Ronald probablement le mérite pour l'ajout de la IEqualityComparer choses.
OriginalL'auteur Ronald Wildenberg
Modifier
Ronald Wildenberg a justement relevé que l'appel Distinct() ne fonctionne que si les instances sont les mêmes. Pour corriger ce je mettre à jour avec la mise en
Vous devriez choisir sa réponse comme correcte (bien que le suivant est correct aussi)
OriginalL'auteur Adrian Iftode
Pour trouver combien de produits sont associés à chaque type de produit (d'où un produit peut avoir plusieurs types de), vous pouvez d'abord sélectionner tous les types distincts comme ce
alors vous pouvez faire une liste de tous les produits qui contiennent chaque type distinct:
Créer votre comparateur d'égalité comme ceci:
*Édité pour ajouter de l'égalité comparateurs de
Distinct
ne fonctionne que si leType
des objets à partir de produits différents, désignent le même cas. Si ce n'est pas le cas, tous lesType
objets sont distincts. Ceci peut être résolu en ayantType
mettre en œuvreIEquatable<Type>
ou par le passage d'une mise en œuvre deIEqualityComparer<Type>
àDistinct()
.semble comme la sélection de Types distincts ne fonctionne pas.
Ensuite, vous devez faire ce que Ronald Wildenberg suggère, et de créer un IEqualityComparer<Type> pour votre type de produit. Je vais mettre à jour ma réponse à inclure.
J'ai essayé ce que vous sugessted et il a travaillé pour moi. En Plus j'ai fait quelques modification sur votre ProductTypeEqualityComparer classe hérite de IEqualityComparer<Type> (Peut ne pas être visible à tout le monde encore)
OriginalL'auteur Franchesca
Pour que vous n'avez pas besoin d'un dictionnaire...
Code:
De sortie:
Francesca j'ai mis à jour le code ci-dessus avec une explication. Et l'op a dit combien il veut utiliser les informations à la fin de la question. Je ne commenterai pas sur la Console.WriteLine partie. Console.WriteLine pourrait être quelque chose d'autre :=)
Et par la façon dont IQueryable<Type> est une sorte de collection à tout moment vous écrivez ToList() sur celui-ci, de plus il peut être adopté partout ailleurs dans le programme, et la création de la liste peut être retardé en cas de besoin. Il serait sympa pour ceux qui sont en train de -1 à expliquer eux-mêmes s'ils se trouvent légitime de le faire.
OriginalL'auteur Marino Šimić