我正在处理C# 2.0 /.NET2.0中的一个问题,其中我有一个排序列表,希望在此Sortedlist的所有“值”(而不是“键”)中搜索某个子字符串,并计算出现的次数。
这就是我想要做的:
{
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指出的)是存在潜在的性能损失,因为它涉及到将所有值复制到另一个列表,然后从头到尾搜索该列表。因此,对于简短的列表,这个答案是有效的。更长的列表?这由你决定..。
发布于 2009-03-06 01:35:52
由于IList Interface实现了IEnumerable,因此实际上可以使用List (IEnumerable) Constructor获取值的List<T>
List<string> myValues = new List<string>(mySortedList.Values);发布于 2009-03-06 01:08:36
不能将Values属性强制转换为List,因为它不是List--它是一个Dictionary.ValueCollection。
但是如果你使用LinqBridge (对于带有C# 3.0的.NET Framework2.0),这个问题很容易用LINQ解决,如下所示:
SortedList<string, string> m = ...;
int namesFound = m.Values.Where(v => v.Contains("substring")).Count();(如果你还在使用C# 2.0,你可以改用Poor-man's LINQ,工作量稍微多一点)
发布于 2009-03-06 01:03:11
太糟糕了,你在.Net 2.0中。这正是LINQ的作用所在。;)
您实际上不能这样做,因为FindAll()是List的一个成员。您可以在mySortedList.Values上创建一个新的列表,但这似乎是一种浪费,因为只为了调用函数就需要分配一个新的对象和底层数组。
我只需要在某个名为FindAll()的列表类中编写一个实用函数,然后传递IList和委托。
https://stackoverflow.com/questions/617374
复制相似问题