使用委托结果作为C#2.0中的输入

时间:2010-10-21 23:46:28

标签: c# delegates

我有List<T>我希望从List<T>找到两个随机名称,从使用.NET 2.0的List中的某些条件开始。

我知道LINQ很容易,但我坚持使用2.0

我想知道我是否可以做这样的事情

List<foo> list = new List<foo>();
List<foo> newlist = new List<foo>();
Random r = new Random();

list.Add(new foo("1"));
list.Add(new foo("A91"));
list.Add(new foo("A01"));
list.Add(new foo("A71"));
list.Add(new foo("B02"));
list.Add(new foo("B2"));
list.Add(new foo("B03"));
list.Add(new foo("23"));
list.Add(new foo("24"));

string[] searchList = { "A", "B", "C",};

foreach (string name in searchList)
{
   List<foo> templist = list.FindAll(delegate (foo f)
                        {
                             List<foo> templist1 = f.Name.StartsWith(name);
                             {
                                if(templist1.Count>0)
                               {
                                  while (templist.Count != 0)
                                 {
                                    ??.Add(templist1[r.Next(templist1.Count)]);

                                 }
                              retrun ??
                            }
                       }
                       });


 }

2 个答案:

答案 0 :(得分:1)

暂且不谈我个人接近.NET 2.0的方式是使用3.5 System.Core dll并复制本地(如Nick Martyshchenko所述)......

这里的实际问题似乎是您没有在匿名委托中返回正确的类型List<T>.FindAll需要Predicate<T>委托。谓词返回bool

List<T>.FindAll与LINQ where方法完全不同。这不是懒惰。也就是说,枚举产生的IEnumerable不是。 FindAll返回List<T>(已枚举)。

也许我不理解你的要求,但为什么不这样做:

List<foo> templist = list.FindAll(delegate (foo f)
                    {
                         bool itemStartsWith = f.Name.StartsWith(name);

                         if(itemStartsWith)
                         {
                            return true;
                         }
                         return false;
                    });

答案 1 :(得分:0)

不是return,而是yield return