List中如何使用FindAll()查找出所有符合的记录?

wesleyluo 2009-09-25 11:02:39
问题是这样的:
我定义了一个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"));提示错误啊?
请教高手要怎么搞?
...全文
4346 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑胡椒 2011-05-11
  • 打赏
  • 举报
回复
list.FindAll 的查询出来的数据 能不能不赋值给其他 list 而直接绑定给DataGridView?
wangwen2020 2009-11-03
  • 打赏
  • 举报
回复
lambda表达式最好!
a8352081 2009-10-05
  • 打赏
  • 举报
回复
学习了
zeroes2021 2009-09-25
  • 打赏
  • 举报
回复
在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行代码。

zhangyanyang 2009-09-25
  • 打赏
  • 举报
回复
delegate string/*返回类型*/ ProcessDelegate(int i);
这就是一个委托的定义。蓝色部分是声明委托的关键字,红色部分是返回的类型,而黑色部分是委托的类型名,和一个类名差不多,而()里的就是参数部分。它的意思是,你要使用这个委托来做事情的话,那么,做事情的方法必须满足以下条件:
1、返回类型和委托的返回类型一致,这里是string类型;
2、能且只能有一个参数,并且是int类型。
……………………………………………………
你的委托返回类型与方法不一致,so 会出错
chaozi_249 2009-09-25
  • 打赏
  • 举报
回复
mark
zhangyanyang 2009-09-25
  • 打赏
  • 举报
回复
返回结果True
zhangyanyang 2009-09-25
  • 打赏
  • 举报
回复
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());
}



zhangyanyang 2009-09-25
  • 打赏
  • 举报
回复

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());
}



这样就好了,你的委托没有返回类型
jiezi316 2009-09-25
  • 打赏
  • 举报
回复

没有仔细看,原来你要传2个参数哇!恩,用匿名委托吧!
hyblusea 2009-09-25
  • 打赏
  • 举报
回复

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;
    }
  
  }
}
sedate952 2009-09-25
  • 打赏
  • 举报
回复
用lambda表达式,即FindAll(lambda表达式)
CsToD 2009-09-25
  • 打赏
  • 举报
回复
List<string>list;
其FindAll方法只接受一个参数,要实现你的要求,则需要使用闭包:
string Str;
list.FindAll(s=>
{
if (s.IndexOf(Str) == -1)
{
return false;
}
else
{
return true;
}
});
jiezi316 2009-09-25
  • 打赏
  • 举报
回复

我记得那里的参数应该是个泛型委托吧!好像不是你怎么写的,你的思路没有问题哈!
jiangshun 2009-09-25
  • 打赏
  • 举报
回复
直接用个循环就可以了啊
foreach(string s in Temp)
(
if(s.indexof(str)>0)
Console.WriteLine("存在");

)
silencexk212112 2009-09-25
  • 打赏
  • 举报
回复
UP!
我姓区不姓区 2009-09-25
  • 打赏
  • 举报
回复
C#3.0以上版本用lambda表达式更简单:

list.FindAll(s => s.Contains(Str));
我姓区不姓区 2009-09-25
  • 打赏
  • 举报
回复
用匿名方法就可以了:

list.FindAll(delegate(string s){return s.Contains(Str);});
Cherishny 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wartim 的回复:]
ls你的还可以简化
ListShow = list.FindAll(delegate(string str) { return str ==filere });
[/Quote]

……
^_^
Cherishny 2009-09-25
  • 打赏
  • 举报
回复
是的
加载更多回复(3)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧