TakeWhile扩展方法在其工具提示中有以下注释:“元素的索引用于谓词函数的逻辑”。请注意,此工具提示在普通工具提示中不可见,而仅在变量sortedDictionary的列表成员的智能感知列表的工具提示中可见。
这正是is正在寻找的与SortedDictionary相结合的东西。
var first = sortedDictionary.First(kv => kv.Key.ToString().StartsWith(searchkey));
var last= sortedDictionary.Last(kv => kv.Key.ToString().StartsWith(searchkey));
var range = sortedDictionary.TakeWhile(kv => kv.Key.ToString().StartsWith(searchkey));第一项和最后一项被找到并且正确,但是我的收集范围是空的。
这里出了什么问题?我希望有一个范围,所有项目都在第一项和最后一项之间,包括它们。
我仍然可以使用first和last找到范围,但是TakeWhile使用了索引,而First和Last显然不使用。
编辑:“使用索引”与排序无关,但您可以在查询中使用索引。例如,当我用SortedList替换SortedDictionary时,我可以这样做:
int ix1 = sortedList.IndexOfKey(first.Key);
int ix2 = sortedList.IndexOfKey(last.Key);
var range = sortedList.SkipWhile((x, i) => i < ix1).TakeWhile((x, i) => i <= ix2);另外,使用SortedDictionary我可以做到:
var range = sortedList.SkipWhile(x => !x.Key.ToString().StartsWith(searchkey))
.TakeWhile(x => x.Key.ToString().StartsWith(searchkey));我必须测试哪种方法更快,还必须测试Where查询。
发布于 2011-02-14 09:20:03
如果序列中的第一个元素与谓词不匹配,则TakeWhile方法将退出:
只要指定的条件为真,
就会返回序列中的元素
First方法将接受与您的谓词匹配的第一个元素:
返回满足指定条件的序列中的第一个元素
与第一个方法相反,Last方法将接受与谓词匹配的最后一个元素:
返回满足指定条件的序列的最后一个元素
我猜测TakeWhile之所以提前退出,是因为在迭代开始时,它们没有匹配条件的元素。
如果您希望元素的范围介于示例中的第一个和最后一个元素之间(包括第一个和最后一个元素),那么尝试这样做:
var range = sortedDictionary.SkipWhile( x => !x.Equals( first ) )
.TakeWhile( x => !x.Equals( last ) )
.Concat( new SortedDictionary<string, string> { { last.Key, last.Value } } );或者,您可以像我一样,使用更简单的方法,像在Jeff's example中那样使用Where方法。
发布于 2011-02-14 09:19:07
TakeWhile()将从序列的开头开始获取条目,只要它们都满足谓词。如果第一项未通过谓词,则结果为空。您正在讨论的描述来自包含索引的overload (您没有使用该索引)。
只需正常过滤项目,它应该会产生您期望的范围(由于排序)。
var range = sortedDictionary.Where(kv => kv.Key.ToString().StartsWith(searchkey));发布于 2011-02-14 08:58:33
您阅读的工具提示适用于其谓词以Int32作为参数MSDN Link的重载
你介意发布一些代码来看看为什么它返回一个空的范围吗?以下代码按预期工作(我复制/粘贴了您的代码)。
var sortedDictionary = new SortedDictionary<string, string>();
var searchkey = "test";
sortedDictionary.Add("test1", "value");
sortedDictionary.Add("test2", "value");
sortedDictionary.Add("test3", "value");
sortedDictionary.Add("test4", "value");
var first = sortedDictionary.First(kv => kv.Key.ToString().StartsWith(searchkey));
var last = sortedDictionary.Last(kv => kv.Key.ToString().StartsWith(searchkey));
var range = sortedDictionary.TakeWhile(
kv => kv.Key.ToString().StartsWith(searchkey));
foreach (var c in range)
{
Console.WriteLine(c);
}
Console.ReadKey();https://stackoverflow.com/questions/4987833
复制相似问题