2009-01-24 8 views
3

J'ai la classe suivante dans mon C# .NET 3.5 formes victoire application:liste Filtrage des objets d'une autre liste

class Field { 

string objectName; 
string objectType; 
string fieldName; 
string fieldValue; 


} 

et une liste fieldList qui est une source de données pour un CheckedListBox. Cette liste affiche tous les objectNames distincts de ma collection fieldList.

Je souhaite créer une autre case à cocher checkedlist contenant fieldNames, mais affiche uniquement les noms de champs associés à un nom d'objet associé dans la première zone de liste.

Donc, ma question est de savoir comment puis-je interroger la source de données de la liste originale de objectNames pour retourner l'ensemble distinct de fieldNames qui sont associés à un objectName sélectionné?

Ce n'est pas très facile à lire, donc je vais donner un exemple:

Field1 { 

objectName = 'objA' 
FieldName = 'FieldA' 

} 

Field2 { 

objectName = 'objA' 
FieldName = 'FieldB' 

} 


Field3 { 

objectName = 'objB' 
FieldName = 'FieldA' 

} 

Field4 { 

objectName = 'objC' 
FieldName = 'FieldC' 

} 

Supposons dans ma case Alors je sélectionne objectnames objA et objB. Ensuite, mes champs retournés seraient «FieldA» et «FieldB». Comment puis-je y parvenir en utilisant LINQ ou en filtrant ma liste générique de champs? Puis-je utiliser les méthodes 'select' ou 'where' qui sont disponibles pour une liste?

Répondre

1
var selectedNames = ... // List of selected names 
var selectedFields = (from f in fieldList 
         where selectedNames.Contains(f.objectName) 
         select f.FieldName).Distinct().ToList(); 
2

Tout d'abord, lisez les noms d'objets dans un tableau ou une liste; Je vais fausser cette partie. Ensuite, il devrait être quelque chose comme:

string[] objectNames = { "objA", "objC" }; 
    var hashSet = new HashSet<string>(objectNames); 

    var qry = (from row in data 
       where hashSet.Contains(row.objectName) 
       select row.fieldName).Distinct().ToList(); 

(modifier) ​​

Pour obtenir les noms sélectionnés (le bit I truqué), vous pouvez essayer (non testé):

var selectedNames = namesCheckedListBox.CheckedItems.Cast<Field>() 
     .Select(field => field.objectName); 
    var hashSet = new HashSet<string>(selectedNames); 

(note pas besoin pour utiliser Distinct() dans le dessus, puisque HashSet<T> le fait de toute façon)

Questions connexes