2009-12-01 2 views
0

У меня есть список, этот список содержит коллекцию следующего классаC#, как найти значение в коллекции List

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

    public int Position 
    { 
     get; 
     set; 
    } 
} 

So OFC определение списка будет выглядеть следующим образом:

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

Я также могу найти коллекцию, используя:

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

До сих пор хорошо выглядело, за исключением того, что я хотел бы сделать, это вернуть MyFile, который не только соответствует имени файла, но также имеет самое высокое значение в поле pos.

Так что, если существуют следующие пункты в списке:

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

и значение FileName = «myDocument.doc» в моем методе находят, то я до сих пор не хватает логики, чтобы вернуть myDocument.doc | 3 этот элемент, потому что это самое высокое значение pos.

В SQL мой запрос будет

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

Спасибо заранее.

+0

Используете ли вы .NET 3.5 или какую-то более раннюю версию? –

+0

используя 3.5, поэтому проблем нет. –

ответ

10

Вы можете использовать Linq? Если да, то простой запрос, как это нужно сделать:

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

Всего пару минут опоздал. (c: – Dathan

+1

Вы хотите использовать FirstOrDefault в том случае, если «Где» возвращает пустой набор. Не выбрасывает ли исключение? – scwagner

+0

Истинно, он выдает исключение, теперь тестирует сначала или по умолчанию. –

2

Это легко с помощью LINQ или расширения методов, если вы используете выше .Net 2.0:

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

+1 для FirstOrDefault –

0

попробовать это:

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; 
     } 
    } 
} 
Смежные вопросы