2012-08-28 8 views
-4

J'ai cette structure de données:Recherche dans une liste imbriquée <T>

class Conference 
{ 
    private List<List<string>>_orgs; 
    public List<List<string>> Orgs 
    { 
     set { _orgs = value; } get { return _orgs; } 
    } 
} 

données dans cette collection:

List<string> sublist = new List<string>(); 
sublist.Add("university"); 
sublist.Add("organization"); 

List<List<string>> list = new List<List<string>>(); 
list.Add(sublist); 

Puis:

Conference c = new Conference(); 
c.Orgs = list; 

J'ai collection d'objets de conférence:

List<Conference> listConferences = new List<Conference>(); 
listConferences.Add(c); 

Je veux rechercher une chaîne comme "uni" et trouver une collection de conférences ont comme "uni". Comment puis-je faire ceci?

+4

Peut-être que vous devriez faire un effort que le code compile réellement avant de poster une question. – leppie

+0

Etes-vous sûr d'avoir choisi la bonne structure de données à utiliser? Cela ne semble pas significatif IMO. –

+0

j'ai fichier xml comme ceci: ' université 123987Bn organisation 465465465sf' i sélectionner abouve structure pour enregistrer ces données de xml file.save nom de l'organisation et le nombre.Quelle est votre recommandation pour la structure? – TAIT

Répondre

0

Vous pouvez le faire:

var selection = listConferences 
       .Where(x => x.Orgs.SelectMany(y => y).Any(y => y.Contains("uni"))) 
       .ToList(); 

Note:

le ToList() de fuite pourrait ne pas être nécessaire en fonction de vos besoins (par exemple si vous itérer sélection une seule fois, vous pouvez sauter).

+0

merci. mais ce résultat de retour de code lors de la recherche par exemple "université". je veux une recherche avec comme condition – TAIT

+0

@TAIT: oui, ma faute désolé. J'ai oublié un morceau de code. Vérifiez ma modification;) – digEmAll

+0

vraiment génial! :) Merci beaucoup. Rechercher plus de 400 000 enregistrements en moins de temps et obtenir une réponse – TAIT

0

Veuillez utiliser ce code, ci-dessous; au lieu du troisième, vous pouvez utiliser votre propre liste de conférence. vous pouvez maintenant utiliser similaire à comme mot-clé.

List<string> first = new List<string>(); 
      first.Add("University"); 
      first.Add("Standard"); 

      List<List<string>> second = new List<List<string>>(); 
      second.Add(first); 

      List<List<List<string>>> third = new List<List<List<string>>>(); 
      third.Add(second); 

      var e = third.Find(delegate(List<List<string>> r) 
         { 
          bool isValid = false; 
          if(r.Count > 0) 
          { 
           foreach(List<string> s in r) 
           { 
            if(s.Count > 0) 
            { 
             isValid = s.FindAll(delegate(string t){ return t.StartsWith("uni", StringComparison.OrdinalIgnoreCase);}).Count > 0; 
            } 
           } 
          } 
          return isValid; 
         }); 
+0

Merci pour la réponse – TAIT

0

Terminé, un autre entraînement utilisant linq. Vous devriez vous sentir à l'aise avec ceci:

var univ = from p in c.Orgs 
         select p.FindAll(r => r.FindAll(s => s.StartsWith("univ", StringComparison.OrdinalIgnoreCase))); 
+0

Merci pour la réponse – TAIT