问题是这样的:
我定义了一个List<String> Temp,然后向Temp中增加了多个String字串,现在我想查找出Temp中,所有包含有String Str的字串List。Str要做为参数传入。
要用FindAll(方法委托)怎么实现?
关键是方法委托要怎么实现?因为要带上参数 Str(需要查找的条件字串); public delegate void FindDelegate(string s, string Str);
        private static bool FindWithStr(string s,string Str)
        {
            if (s.IndexOf(Str) == -1)
            {
                return false;
            }
            else
            {
                return true;
            }
        }是不是按上面的来做?
FindDelegate FindD=new FindDelegate(FindWithStr);
但是在调用Temp.FindAll(FinD("sss","s"));提示错误啊?
请教高手要怎么搞?

解决方案 »

  1.   

    直接用个循环就可以了啊
    foreach(string s in Temp)
    (
      if(s.indexof(str)>0)
          Console.WriteLine("存在");)
      

  2.   

    List<string>list;
    其FindAll方法只接受一个参数,要实现你的要求,则需要使用闭包:
    string Str;
    list.FindAll(s=>
    {
    if (s.IndexOf(Str) == -1)
                {
                    return false;
                }
                else
                {
                    return true;
                }
    });
      

  3.   

    用lambda表达式,即FindAll(lambda表达式)
      

  4.   


    using System;
    using System.Collections.Generic;
    using System.Text;
      
    namespace ConsoleApplication7
    ...{
      class Program
      ...{
        static void Main(string[] args)
        ...{
          List<int[]> alSchedule = new List<int[]>();//声明一个存放int[]元素的 集合
          alSchedule.Add(new int[] ...{ 1, 2, 3 });
          alSchedule.Add(new int[] ...{ 1, 2, 3, 4 });
          int[] result = alSchedule.Find(FindElements);
          if (result != null)
          ...{
            Console.WriteLine(result);
          }
          Console.Read();
        }
        private static bool FindElements(int[] arrInt)
        ...{
          return IsEquals(arrInt, new int[] ...{ 1, 2, 3 });
        }
        public static bool IsEquals(Array array1, Array array2)
        ...{
          //比较类型是否一样
          if (!Object.ReferenceEquals(array1.GetType(), array2.GetType()))
          ...{
            return false;
          }
      
          //比较长度是否一样
          if (array1.GetLength(0) != array2.GetLength(0))
          ...{
            return false;
          }
      
          //比较成员是否对应相等
          ValueType v1, v2;
          for (int i = 0; i < array1.GetLength(0); i++)
          ...{
            v1 = (ValueType)array1.GetValue(i);
            v2 = (ValueType)array2.GetValue(i);
      
            if (!v1.Equals(v2))
            ...{
              return false;
            }
          }
          return true;
        }
      
      }
    }
      

  5.   


    public delegate bool FindDelegate(string s, string Str);
            private static bool FindWithStr(string s,string Str)
            {
                if (s.IndexOf(Str) == -1)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
    private void button1_Click(object sender, EventArgs e)
            {
                FindDelegate fd = new FindDelegate(FindWithStr);
                bool tf = fd("axzsdc", "s");
                MessageBox.Show(tf.ToString());
            }这样就好了,你的委托没有返回类型
      

  6.   

    public delegate bool  FindDelegate(string s, string Str);
            private static bool FindWithStr(string s,string Str)
            {
                if (s.IndexOf(Str) == -1)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
    private void button1_Click(object sender, EventArgs e)
            {
                FindDelegate fd = new FindDelegate(FindWithStr);
                bool tf = fd("axzsdc", "s");
                MessageBox.Show(tf.ToString());
            }
      

  7.   

    delegate string/*返回类型*/ ProcessDelegate(int i);
    这就是一个委托的定义。蓝色部分是声明委托的关键字,红色部分是返回的类型,而黑色部分是委托的类型名,和一个类名差不多,而()里的就是参数部分。它的意思是,你要使用这个委托来做事情的话,那么,做事情的方法必须满足以下条件:
    1、返回类型和委托的返回类型一致,这里是string类型;
    2、能且只能有一个参数,并且是int类型。
    ……………………………………………………
    你的委托返回类型与方法不一致,so 会出错
      

  8.   

    在MSDN中查找 List<T>.FindAll 方法,得出
    public List<T> FindAll(
    Predicate<T> match
    )
    很明显泛型委托的参数个数为一个,类型于List的类型一样,所以“调用Temp.FindAll(FinD("sss","s"));”肯定报错,可以设置类的私有变量来存放过滤条件,在调用FindAll方法前赋值,在FinD方法内取值。
    比如:
      private string filterStr = "";
            private void button_AddRange_Click(object sender, EventArgs e)
            {
                this.strList.AddRange(new string[] { "123","zbl", "Azbl","zblB","AzblB","123456" });
                this.filterStr = "zbl";
                List<string> tempList = this.strList.FindAll(FilterList);            
            }        private bool FilterList(string listItem)
            {
                return listItem.Contains(this.filterStr);        
            }
    另外判断一个字符串是否包含另一个字符串就简单的调用 Contains 方法,不要像你那样萝莉啰唆的 if (s.IndexOf(Str) == -1)
                {
                    return false;
                }
                else
                {
                    return true;
                }
    1行代码完成的功能,你用了8行代码。
      

  9.   

    string filere = "要查找的符合条件的值"; 
    ListShow = list.FindAll(new Predicate<string>(delegate(string str) { return str ==filere  ); }));
      

  10.   

    ls你的还可以简化
    ListShow = list.FindAll(delegate(string str) { return str ==filere });
      

  11.   

    List <string> Temp = new List<string>();
    ……
    Temp.Add(……);
    string str = "something";
    List<string> Result = Temp .FindAll(new Predicate <string>(delegate(string strr) { return strr==str ); }));
    这样就行了
      

  12.   

    用匿名方法就可以了:list.FindAll(delegate(string s){return s.Contains(Str);});
      

  13.   

    C#3.0以上版本用lambda表达式更简单:list.FindAll(s => s.Contains(Str));
      

  14.   

    list.FindAll 的查询出来的数据 能不能不赋值给其他 list  而直接绑定给DataGridView?