首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在IList<T>上执行FindAll()?(例如,SortedList.Values)

如何在IList<T>上执行FindAll()?(例如,SortedList.Values)
EN

Stack Overflow用户
提问于 2009-03-06 00:58:44
回答 5查看 4.3K关注 0票数 1

我正在处理C# 2.0 /.NET2.0中的一个问题,其中我有一个排序列表,希望在此Sortedlist的所有“值”(而不是“键”)中搜索某个子字符串,并计算出现的次数。

这就是我想要做的:

代码语言:javascript
运行
复制
{
   Sortedlist<string,string> mySortedList;
   // some code that instantiates mySortedList and populates it with data
   List<string> myValues = mySortedList.Values;  // <== does not work
   int namesFound = myValues.FindAll(ByName(someName)).Count;
}

当然,这是不起作用的,因为mySortedList.Values返回一个IList,而"myValues“是一个列表。我尝试“转换”IList,以便myValues可以接受它,但似乎不起作用。

当然,我可以在"foreach“循环中遍历mySortedList.Values,但我并不真的想这样做。

有人有什么建议吗?

EDIT-1:好的,看起来似乎没有一种本地的方法可以轻松地做到这一点。我以为我只是错过了什么,但显然我没有。所以我想我只是要在IList上做一个"foreach“。

感谢大家的反馈!我投票给每个人1分,因为我认为所有的反馈都很好。再次感谢!:-)

EDIT-2:看起来CMS有我想要的答案。唯一的警告(正如Qwertie指出的)是存在潜在的性能损失,因为它涉及到将所有值复制到另一个列表,然后从头到尾搜索该列表。因此,对于简短的列表,这个答案是有效的。更长的列表?这由你决定..。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-06 01:35:52

由于IList Interface实现了IEnumerable,因此实际上可以使用List (IEnumerable) Constructor获取值的List<T>

代码语言:javascript
运行
复制
List<string> myValues = new List<string>(mySortedList.Values);
票数 2
EN

Stack Overflow用户

发布于 2009-03-06 01:08:36

不能将Values属性强制转换为List,因为它不是List--它是一个Dictionary.ValueCollection。

但是如果你使用LinqBridge (对于带有C# 3.0的.NET Framework2.0),这个问题很容易用LINQ解决,如下所示:

代码语言:javascript
运行
复制
SortedList<string, string> m = ...;
int namesFound = m.Values.Where(v => v.Contains("substring")).Count();

(如果你还在使用C# 2.0,你可以改用Poor-man's LINQ,工作量稍微多一点)

票数 2
EN

Stack Overflow用户

发布于 2009-03-06 01:03:11

太糟糕了,你在.Net 2.0中。这正是LINQ的作用所在。;)

您实际上不能这样做,因为FindAll()是List的一个成员。您可以在mySortedList.Values上创建一个新的列表,但这似乎是一种浪费,因为只为了调用函数就需要分配一个新的对象和底层数组。

我只需要在某个名为FindAll()的列表类中编写一个实用函数,然后传递IList和委托。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/617374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档