Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2306321
  • 博文数量: 266
  • 博客积分: 5485
  • 博客等级: 大校
  • 技术积分: 3695
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-20 11:05
个人简介

多读书,多做事,广交朋友,趣味丛生

文章分类

全部博文(266)

分类: Java

2008-07-26 19:39:34

以前在开发中为了对List,String[].Array进行元素的查找一般都是这样做:
List lists = new List();
list.add("111");
.....

for(int i=0;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

 

*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);


 

查找DropDownList中的Item的
ListItemCollection items 
= DisplayModeDropdown.Items;

查找 Index:
    
int selectedIndex = items.IndexOf(items.FindByText("需要查找匹配的item"));

查找 Value:
    
string selectedValue = items.FindByText("需要查找匹配的item");
阅读(17213) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~