2009-12-01 2 views
0

이 목록은 목록 정의는 다음과 같이됩니다 OFCC#을 나는 목록을

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

    public int Position 
    { 
     get; 
     set; 
    } 
} 

그래서 다음 클래스의 컬렉션을 포함 다음과 같이 컬렉션을 검색 할 수도 있습니다.

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

지금까지 좋아 보이는 부분을 제외하고는 MyFile은 파일 이름과 일치 할뿐만 아니라 필드 pos에서 가장 높은 값을가집니다. 다음 항목이 목록에 존재 그렇다면

: | 3

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

나의 발견 방법에서 fileName에 = "myDocument.doc"의 값은, 나는 여전히 myDocument.doc를 반환하는 논리를 놓친 거지 이것은 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

) Where가 빈 집합을 반환하는 경우 FirstOrDefault를 사용하려고합니다. 예외를 throw하지 않습니까? – scwagner

+0

True를 지정하면 예외가 발생하여 처음 또는 기본값으로 테스트합니다. –

2

을이 쉽게 LINQ 또는 확장 방법을 사용하면 닷넷 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; 
     } 
    } 
}