2009-12-01 59 views
0

我有一个列表这个列表包含以下类的集合C#如何找到一个列表集合值

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

    public int Position 
    { 
     get; 
     set; 
    } 
} 

所以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 

和文件名=“myDocument.doc”在我的查找方法的价值,那么我仍然缺少逻辑回归myDocument.doc | 3这个项目,因为这是pos的最高值。

在SQL我的查询将提前

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

感谢。

+0

您使用.NET 3.5或更早版本吗? – 2009-12-01 19:56:57

+0

使用3.5所以没有问题。 – 2009-12-01 19:57:23

回答

10

你可以使用Linq吗?如果是这样,像这样一个简单的查询应该这样做:

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

迟到了几分钟。 (c: – Dathan 2009-12-01 20:00:10

+1

如果Where返回一个空集合,你会想要使用FirstOrDefault,这不会抛出一个异常吗? – scwagner 2009-12-01 20:00:23

+0

真的,它会抛出一个异常,现在用第一个或默认测试 – 2009-12-01 20:02:56

2

这是很容易使用LINQ或扩展方法,如果你使用上面的.Net 2.0:

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

+1 – 2009-12-01 20:11:27

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; 
     } 
    } 
} 
相关问题