读书人

LIST.FindIndex(predicatelt;Tgt; match)

发布时间: 2013-12-20 00:23:10 作者: rapoo

LIST.FindIndex(predicate<T> match)的参数问题
List.FindIndex(predicate<T> match)的参数是怎么写啊?这个看不懂。。。
谁能帮我

//删除一个教师记录
public static void Delete()
{
//根据工号查询,是否存在该记录,如不存在则提示,存在则删除
teacherID = Console.ReadLine(); //输入工号
//根据teacherID查询集合类 1.foreach遍历整个集合 2.List<T>类提供的FindIndex方法


int index1 = teacherList.FindIndex(teacherID);//----错误:参数不正确
if (index1 = (-1))
{
Console.WriteLine("没有此工号!");
}
else
{
teacherList.RemoveAt(index1);

}


上面代码FindIndex参数怎么写呢?
好心人,帮帮忙吧!
[解决办法]
teacherList的定义呢?

predicate<T>这样的泛型委托一般采用lambda表达式的形式来表示,形式是
i => i == teacherID
这里假定
var teacherList = new List<string>();
[解决办法]
predicate是个delegate,定义为:
public delegate bool Predicate<T> (T obj)

只要是个函数,或者匿名函数,符合上面的声明即可。

下面是msdn中List.FindIndex的例子,来自:
http://msdn.microsoft.com/zh-cn/library/x1xzf2ca(v=vs.80).aspx


using System;
using System.Collections.Generic;

public class Example
{
public static void Main()
{
List<string> dinosaurs = new List<string>();

dinosaurs.Add("Compsognathus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Oviraptor");
dinosaurs.Add("Velociraptor");
dinosaurs.Add("Deinonychus");
dinosaurs.Add("Dilophosaurus");
dinosaurs.Add("Gallimimus");
dinosaurs.Add("Triceratops");

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}

Console.WriteLine("\nFindIndex(EndsWithSaurus): {0}",
dinosaurs.FindIndex(EndsWithSaurus));

Console.WriteLine("\nFindIndex(2, EndsWithSaurus): {0}",
dinosaurs.FindIndex(2, EndsWithSaurus));

Console.WriteLine("\nFindIndex(2, 3, EndsWithSaurus): {0}",
dinosaurs.FindIndex(2, 3, EndsWithSaurus));
}

// Search predicate returns true if a string ends in "saurus".
private static bool EndsWithSaurus(String s)
{
if ((s.Length > 5) &&
(s.Substring(s.Length - 6).ToLower() == "saurus"))
{


return true;
}
else
{
return false;
}
}
}

/* This code example produces the following output:

Compsognathus
Amargasaurus
Oviraptor
Velociraptor
Deinonychus
Dilophosaurus
Gallimimus
Triceratops

FindIndex(EndsWithSaurus): 1

FindIndex(2, EndsWithSaurus): 5

FindIndex(2, 3, EndsWithSaurus): -1
*/


[解决办法]
看懂定义
public delegate bool Predicate<in T>(T obj);
为前提条件。

很多时候的迷茫都是因为我们对基础一点的知识根本视而不见,而只想急功近利地去“搞定”什么。其实根本搞不定。

你此时应该去从基础的“使用delegate 作为方法参数”这种设计概念学起。可以先用一天时间,完全忘记FindIndex,而是去打基础。那样等你再来看FindIndex,就根本不会写“teacherID”这种一眼就看出类型错误的代码了。
[解决办法]

int index1 = teacherList.FindIndex(teacher=>teacher.teacherID==teacherID);


把你报错的那一句改成这个就OK了。
这种参数是接收一个委托。
相当于循环了一次teacherList,teacher是每次循环的那个对象,然后比较他们的ID。
[解决办法]
请高人指点一下,如何实现带多个参数的Predicate委托,官网和网上找的只有系统默认一个参数的写法,自己加上参数就通不过,根据以下代码,如何实现相同的委托只写一次?

/// <summary>
/// 检查此控件是否支持指定的数据类型
/// </summary>
/// <param name="name">数据类型名称</param>
/// <returns>返回当前对象是否支持指定的数据类型</returns>
public bool HasSupportDataType(string name) {
name = name.ToLower();
return this._types.Exists(theType => {
return this.PredicateDataType(theType, name);
});
}

public BSysDataType DataType(string name) {
name = name.ToLower();
return this._types.Find(theType => {
return this.PredicateDataType(theType, name);
});
}

/// <summary>
/// 比较对象是否相等
/// </summary>
/// <param name="theType">要比较的对象</param>
/// <param name="name">对象名称</param>
/// <returns>返回对象是否相等</returns>
private bool PredicateDataType(BSysDataType theType, string name) {
return theType.Name.ToLower() == name;
}



以上代码中,“theType => { return this.PredicateDataType(theType, name); }”仍然写了两次一样的,而我想实现只要像一个参数那样只提示委托名称就可以,如楼上的:“dinosaurs.FindIndex(EndsWithSaurus));”
谢谢!!
[解决办法]
我上面的代码中PredicateDataType并不是真正意义上的委托,而是用了两个完全相同但却是两个独立的匿名委托来调用同一个方法,所以我想实现写一个委托,可以使用相同的参数(除了系统默认的那个参数以外我还要加入我自己要比较的参数)进行操作,而不是像官网上比较条件用常量的方法,谢谢!

读书人网 >C#

热点推荐