2008-12-16 33 views

回答

3

您可以尝试Predicate。这是我写的代码来说明这一点。当然,正如你在这个例子中看到的那样,你可以将Predicate移出调用类并对其进行控制。如果您需要更多选项,这非常有用。在谓词中,可以与对象的所有属性/函数进行许多比较。

static void Main() 
    { 
     List<SimpleObject> list = new List<SimpleObject>(); 
     list.Add(new SimpleObject(1,"Jon")); 
     list.Add(new SimpleObject(2, "Mr Skeet")); 
     list.Add(new SimpleObject(3,"Miss Skeet")); 
     Predicate<SimpleObject> yourFilterCriteria = delegate(SimpleObject simpleObject) 
     { 
      return simpleObject.Name.Contains("Skeet"); 
     }; 
     list = list.FindAll(yourFilterCriteria);//Get only name that has Skeet : Here is the magic 
     foreach (SimpleObject o in list) 
     { 
      Console.WriteLine(o); 
     } 
     Console.Read(); 
    } 
    public class SimpleObject 
    { 
     public int Id; 
     public string Name; 

     public SimpleObject(int id, string name) 
     { 
      this.Id=id; 
      this.Name=name; 
     } 

     public override string ToString() 
     { 
      return string.Format("{0} : {1}",Id, Name); 
     } 
    } 
+0

使用匿名代理,这不是.NET 1.1 – FlySwat 2008-12-16 21:41:52

+0

他说c#2.0版没有1.1? – 2008-12-16 21:44:07

8

如果我正确地遵循你的问题,你可以拨打Find()FindAll()方法来获得数据项淘汰之列。例如:

List<string> myList = ..; 
List<string> startingWithA = myList.FindAll(delegate(string s) { return s.StartsWith("A"); }); 
0

不幸的是,清单数据结构需要反复查找数据(注意的FindAll以上方法将遍历被窝里您的收藏 - 以防万一你试图避免不惜一切代价),除非你知道该数据的索引,那么你可以这样做:

List<String> list = new List<String>(); 
list.Add("andrew"); 
list.Add("nicole"); 

String value = list[1]; // returns "nicole" 
2

没有LINQ,你的主要选择是做循环和比较列表中的每个元素。有几种方法可以帮助你。

List<T>.FindAll()需要一个Predicate委托,并将返回所有符合条件的项目。 List<T>.CopyTo()List<T>.GetRange()让你提取一系列元素。除此之外,你真的不能在LINQ以外的特定选择方面做很多事情。

1

事实是,即使您最终通过Find或FindAll使用Predicates,它在内部执行的所有操作都是循环遍历列表,然后运行Predicate来测试匹配。性能明智,你没有得到任何东西,但它绝对使得整洁的代码。

0

我认为上面的大多数答案都只是提供替代方法来完成你想要避免的事情。根据数据结构,无论您选择哪种实施方式,您/它都必须比较每个项目并挑选出匹配的项目。

根据您的匹配条件,SortedList可以帮助您避免在每个查询中搜索整个列表。如果您的列表包含您创建的对象,则重写GetHashCode和Equals将帮助您解决问题。

如果您的匹配标准相当复杂,您可能需要完全不同的数据结构,例如字符串为trie

相关问题