2008-12-16 94 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

相關問題