问题是这样的:
我定义了一个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"));提示错误啊?
请教高手要怎么搞?
我定义了一个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"));提示错误啊?
请教高手要怎么搞?
foreach(string s in Temp)
(
if(s.indexof(str)>0)
Console.WriteLine("存在");)
其FindAll方法只接受一个参数,要实现你的要求,则需要使用闭包:
string Str;
list.FindAll(s=>
{
if (s.IndexOf(Str) == -1)
{
return false;
}
else
{
return true;
}
});
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;
}
}
}
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());
}这样就好了,你的委托没有返回类型
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());
}
这就是一个委托的定义。蓝色部分是声明委托的关键字,红色部分是返回的类型,而黑色部分是委托的类型名,和一个类名差不多,而()里的就是参数部分。它的意思是,你要使用这个委托来做事情的话,那么,做事情的方法必须满足以下条件:
1、返回类型和委托的返回类型一致,这里是string类型;
2、能且只能有一个参数,并且是int类型。
……………………………………………………
你的委托返回类型与方法不一致,so 会出错
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行代码。
ListShow = list.FindAll(new Predicate<string>(delegate(string str) { return str ==filere ); }));
ListShow = list.FindAll(delegate(string str) { return str ==filere });
……
Temp.Add(……);
string str = "something";
List<string> Result = Temp .FindAll(new Predicate <string>(delegate(string strr) { return strr==str ); }));
这样就行了