以前在開發中為了對List,String[].Array進行元素的查找一般都是這樣做:
List lists = new List();
list.add("111");
.....
for(int i=0;i<list.length;i++)
{
if(list[i].equals("要查找的元素"))
{....}
}
其實在C# 2.0對List,Array元素的查找,MS已經提供了一些泛型方法,讓Coding人員更好的查找,遍歷,等等...
以下是我簡單對List的一些操作所寫的Demo.供大家參考,以及和大家進行交流。
static void Main(string[] args)
{
//Prdicate用法
//第一種用法:[不創建顯式的委托,也不創建指定泛型方法的類型參數]
ListOneMethod();
//Prdicate用法
//第二種用法:[創建顯式的委托,也創建指定泛型方法的類型參數]
ListTwoMethod();
//第三種用法:[同於第二種方法,但用了兩個類進行區分]
ListThreeMethod();
}
#region 第一種用法
private static void ListOneMethod()
{
String[] strs = { "WPF", "WCF", "WF", "Author", "WinFx", "Linq" };
String Name = Array.Find(strs, FindWhere);
Console.WriteLine("Result: ---------- " + Name + " ----------");
}
public static Boolean FindWhere(String str)
{
return str.Equals("Author") ? true : false;
}
#endregion
#region 第二種用法
private static void ListTwoMethod()
{
List<String> strlist = new List<String>();
strlist.Add("WPF");
strlist.Add("WCF");
strlist.Add("WF");
strlist.Add("Author");
strlist.Add("WinFx");
strlist.Add("Linq");
Predicate<String> FindValues = delegate(String list)
{
return list.Equals("WinFx") ? true : false;
};
Console.WriteLine("Result: ---FindIndex--- " + strlist.FindIndex(FindValues) + " ----------");
Console.WriteLine("Result: ---Exists---- " + strlist.Exists(FindValues) + " ----------");
List<String> lists = strlist.FindAll(FindValues);
foreach (string str in lists)
{
Console.WriteLine("Result: ---FindAll----- " + str + " ----------");
}
Console.WriteLine("Result: ---FindLast---- " + strlist.FindLast(FindValues) + " ----------");
Console.WriteLine("Result: ---FindLastIndex-- " + strlist.FindLastIndex(FindValues) + " ----------");
Console.WriteLine("Result: ---RemoveAll-- " + strlist.RemoveAll(FindValues) + " ----------");
Console.WriteLine("Result: ---TrueForAll- " + strlist.TrueForAll(FindValues) + " ----------");
}
#endregion
#region 第三種用法
private static void ListThreeMethod()
{
ListClass lists = new ListClass();
// 使用List.Add()方法來新增集合內容
lists.Values.Add(new ValueClass("WPF"));
lists.Values.Add(new ValueClass("WCF"));
lists.Values.Add(new ValueClass("WF"));
lists.Values.Add(new ValueClass("Author"));
lists.Values.Add(new ValueClass("WinFx"));
lists.Values.Add(new ValueClass("Linq"));
Predicate<ValueClass> FindValue = delegate(ValueClass obj) { return obj.Value == "Author"; };
Console.WriteLine("Result: ---------- " + lists.Values.FindIndex(FindValue) + " ----------");
Console.WriteLine("將所有資料列出");
int idx = 0;
Action<ValueClass> ListAll = delegate(ValueClass obj)
{
Console.WriteLine(string.Format("第 {0} 個的Value值為 {1}", idx, obj.Value));
idx++;
};
lists.Values.ForEach(ListAll);
}
public class ValueClass
{
private string _value = string.Empty;
public string Value
{
get { return _value; }
}
public ValueClass(string value)
{
_value = value;
}
}
public class ListClass
{
private List<ValueClass> _values = new List<ValueClass>();
public List<ValueClass> Values
{
get { return _values; }
}
public ListClass() { }
}
#endregion
{
//Prdicate用法
//第一種用法:[不創建顯式的委托,也不創建指定泛型方法的類型參數]
ListOneMethod();
//Prdicate用法
//第二種用法:[創建顯式的委托,也創建指定泛型方法的類型參數]
ListTwoMethod();
//第三種用法:[同於第二種方法,但用了兩個類進行區分]
ListThreeMethod();
}
#region 第一種用法
private static void ListOneMethod()
{
String[] strs = { "WPF", "WCF", "WF", "Author", "WinFx", "Linq" };
String Name = Array.Find(strs, FindWhere);
Console.WriteLine("Result: ---------- " + Name + " ----------");
}
public static Boolean FindWhere(String str)
{
return str.Equals("Author") ? true : false;
}
#endregion
#region 第二種用法
private static void ListTwoMethod()
{
List<String> strlist = new List<String>();
strlist.Add("WPF");
strlist.Add("WCF");
strlist.Add("WF");
strlist.Add("Author");
strlist.Add("WinFx");
strlist.Add("Linq");
Predicate<String> FindValues = delegate(String list)
{
return list.Equals("WinFx") ? true : false;
};
Console.WriteLine("Result: ---FindIndex--- " + strlist.FindIndex(FindValues) + " ----------");
Console.WriteLine("Result: ---Exists---- " + strlist.Exists(FindValues) + " ----------");
List<String> lists = strlist.FindAll(FindValues);
foreach (string str in lists)
{
Console.WriteLine("Result: ---FindAll----- " + str + " ----------");
}
Console.WriteLine("Result: ---FindLast---- " + strlist.FindLast(FindValues) + " ----------");
Console.WriteLine("Result: ---FindLastIndex-- " + strlist.FindLastIndex(FindValues) + " ----------");
Console.WriteLine("Result: ---RemoveAll-- " + strlist.RemoveAll(FindValues) + " ----------");
Console.WriteLine("Result: ---TrueForAll- " + strlist.TrueForAll(FindValues) + " ----------");
}
#endregion
#region 第三種用法
private static void ListThreeMethod()
{
ListClass lists = new ListClass();
// 使用List.Add()方法來新增集合內容
lists.Values.Add(new ValueClass("WPF"));
lists.Values.Add(new ValueClass("WCF"));
lists.Values.Add(new ValueClass("WF"));
lists.Values.Add(new ValueClass("Author"));
lists.Values.Add(new ValueClass("WinFx"));
lists.Values.Add(new ValueClass("Linq"));
Predicate<ValueClass> FindValue = delegate(ValueClass obj) { return obj.Value == "Author"; };
Console.WriteLine("Result: ---------- " + lists.Values.FindIndex(FindValue) + " ----------");
Console.WriteLine("將所有資料列出");
int idx = 0;
Action<ValueClass> ListAll = delegate(ValueClass obj)
{
Console.WriteLine(string.Format("第 {0} 個的Value值為 {1}", idx, obj.Value));
idx++;
};
lists.Values.ForEach(ListAll);
}
public class ValueClass
{
private string _value = string.Empty;
public string Value
{
get { return _value; }
}
public ValueClass(string value)
{
_value = value;
}
}
public class ListClass
{
private List<ValueClass> _values = new List<ValueClass>();
public List<ValueClass> Values
{
get { return _values; }
}
public ListClass() { }
}
#endregion
*Predicate 是對方法的委托,如果傳遞給它的對象與委托中定義的條件匹配,則該方法返回 true。當前 List 的元素被逐個傳遞給 Predicate 委托,在找到匹配項時停止處理。此方法執行線性搜索;
還有就是有關於List其他的一些查找方法:
1.當需要依條件來尋找集合內的某個類別時, 可用List<T>Find(), List<T>FindLast()來搜尋, 回傳搜尋到的類別
2.當需要依條件來尋找集合內的某些類別時, 可用List<T>FindAll()來搜尋, 將回傳一個新的List<T>對象集合
3.當需要依條件來尋找集合內的某個類別的索引值時, 可用List<T>FindIndex(), List<T>FindLastIndex()
4.List<T>Find(), List<T>FindLast()的不同是, List<T>Find()由Index=0開始尋找, 而List<T>FindLast()由Index = List<T>.Count - 1開始尋找
同理, List<T>FindIndex(), List<T>FindLastIndex()也是一樣, 不同的是, 這兩個回傳的是索引值
5.當使用List<T>Find()相關函示時, 必須delegate.這個Predicate<T>
其內容就是搜尋的判斷式, 如:
Predicate<class1> FindJaofeng = delegate(class1 obj) {
return obj.Value == "Jaofeng";
};
return type為boolean值
而上面也有介紹一個List<T>.ForEach(), 這個Method只是將原本我們用foreach()的方式, 簡化而已
譬如原本的習慣寫法:
foreach (class1 cls in myText.Values) {
//
Do something
}
// 現在變成
Action<class1> ActionName = delegate(class1 obj) {
//
Do something
};
myText.Values.ForEach(ActionName);
1.當需要依條件來尋找集合內的某個類別時, 可用List<T>Find(), List<T>FindLast()來搜尋, 回傳搜尋到的類別
2.當需要依條件來尋找集合內的某些類別時, 可用List<T>FindAll()來搜尋, 將回傳一個新的List<T>對象集合
3.當需要依條件來尋找集合內的某個類別的索引值時, 可用List<T>FindIndex(), List<T>FindLastIndex()
4.List<T>Find(), List<T>FindLast()的不同是, List<T>Find()由Index=0開始尋找, 而List<T>FindLast()由Index = List<T>.Count - 1開始尋找
同理, List<T>FindIndex(), List<T>FindLastIndex()也是一樣, 不同的是, 這兩個回傳的是索引值
5.當使用List<T>Find()相關函示時, 必須delegate.這個Predicate<T>
其內容就是搜尋的判斷式, 如:
Predicate<class1> FindJaofeng = delegate(class1 obj) {
return obj.Value == "Jaofeng";
};
return type為boolean值
而上面也有介紹一個List<T>.ForEach(), 這個Method只是將原本我們用foreach()的方式, 簡化而已
譬如原本的習慣寫法:
foreach (class1 cls in myText.Values) {
//

}
// 現在變成
Action<class1> ActionName = delegate(class1 obj) {
//

};
myText.Values.ForEach(ActionName);







