2009-12-01 8 views
0

J'ai une liste cette liste contient une collection de la classe suivanteC# comment trouver une valeur dans une liste collection

public class MyFile 
{ 
    public string FileName 
    { 
     get; 
     set; 
    } 

    public int Position 
    { 
     get; 
     set; 
    } 
} 

Alors ofc la définition de la liste ressemblera à ceci:

private List<MyFile> MyFiles = new List<MyFile>(); 

Je peux aussi rechercher la collection en utilisant:

MyFile tmpFile = MyFiles.Find(delegate(MyFile item) 
    { return item.FileName == fileName; }); 

jusqu'à présent, en regardant bien, sauf ce que je voudrais faire est de retourner le MyFile qui non seulement correspond au nom du fichier mais qui a également la valeur la plus élevée dans le champ pos.

Donc, si les éléments suivants existent dans la liste:

myDocument.doc|1 
myDocument.doc|2 
myDocument.doc|3 
myPDF.pdf|1 
myPDF.pdf|2 
myPDF.pdf|3 

et la valeur de fileName = « MonDocument.doc » dans ma méthode de recherche, je suis toujours la logique qui manque à revenir MonDocument.doc | 3 cet article, parce que cela a la plus haute valeur de pos.

Dans ma requête SQL serait

select top 1 * from MyFiles 
where fileName = 'myDocument.doc' 
order by position desc; 

Merci à l'avance.

+0

Utilisez-vous .NET 3.5 ou une version antérieure? –

+0

en utilisant 3,5 donc pas de problèmes là-bas. –

Répondre

10

Pouvez-vous utiliser Linq? Dans ce cas, une requête simple comme cela devrait faire:

MyFile file = MyFiles.Where(f => f.FileName == fileName).OrderByDescending(f => f.Position).FirstOrDefault(); 
+0

Juste quelques minutes en retard. (c: – Dathan

+1

Vous devez utiliser FirstOrDefault dans le cas où l'option Where renvoie un jeu. Cela ne déclenche-t-il pas une exception? – scwagner

+0

True il lève une exception, testant maintenant avec le premier ou le par défaut –

2

C'est facile en utilisant des méthodes de LINQ ou d'extension si vous utilisez ci-dessus .Net 2.0:

MyFile tmpFile = MyFiles.Where(file => file.FileName == "myDocument.doc").OrderByDescending(file => file.Position).FirstOrDefault(); 
+0

+1 pour FirstOrDefault –

0

essayez ceci:

public class MyFileList: List<MyFile> 
{ 
    public MyFile this[string filName] 
    { 
     get 
     { 
      int maxPos = int.MinValue; 
      MyFile retFile = null; 
      foreach(MyFile fil in this) 
      if (fil.FileName == filName && 
       fil.Position > maxPos) 
      { 
       maxPos = fil.Position; 
       retFile= fil; 
      } 
      return retFile; 
     } 
    } 
} 
Questions connexes