首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SortedDictionary TakeWhile返回空

使用SortedDictionary TakeWhile返回空
EN

Stack Overflow用户
提问于 2011-02-14 08:14:08
回答 3查看 2.1K关注 0票数 2

TakeWhile扩展方法在其工具提示中有以下注释:“元素的索引用于谓词函数的逻辑”。请注意,此工具提示在普通工具提示中不可见,而仅在变量sortedDictionary的列表成员的智能感知列表的工具提示中可见。

这正是is正在寻找的与SortedDictionary相结合的东西。

代码语言:javascript
复制
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使用了索引,而FirstLast显然不使用。

编辑:“使用索引”与排序无关,但您可以在查询中使用索引。例如,当我用SortedList替换SortedDictionary时,我可以这样做:

代码语言:javascript
复制
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我可以做到:

代码语言:javascript
复制
var range = sortedList.SkipWhile(x => !x.Key.ToString().StartsWith(searchkey))
                      .TakeWhile(x => x.Key.ToString().StartsWith(searchkey));

我必须测试哪种方法更快,还必须测试Where查询。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-14 09:20:03

如果序列中的第一个元素与谓词不匹配,则TakeWhile方法将退出:

只要指定的条件为真,

就会返回序列中的元素

First方法将接受与您的谓词匹配的第一个元素:

返回满足指定条件的序列中的第一个元素

与第一个方法相反,Last方法将接受与谓词匹配的最后一个元素:

返回满足指定条件的序列的最后一个元素

我猜测TakeWhile之所以提前退出,是因为在迭代开始时,它们没有匹配条件的元素。

如果您希望元素的范围介于示例中的第一个和最后一个元素之间(包括第一个和最后一个元素),那么尝试这样做:

代码语言:javascript
复制
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方法。

票数 1
EN

Stack Overflow用户

发布于 2011-02-14 09:19:07

TakeWhile()将从序列的开头开始获取条目,只要它们都满足谓词。如果第一项未通过谓词,则结果为空。您正在讨论的描述来自包含索引的overload (您没有使用该索引)。

只需正常过滤项目,它应该会产生您期望的范围(由于排序)。

代码语言:javascript
复制
var range = sortedDictionary.Where(kv => kv.Key.ToString().StartsWith(searchkey));
票数 1
EN

Stack Overflow用户

发布于 2011-02-14 08:58:33

您阅读的工具提示适用于其谓词以Int32作为参数MSDN Link的重载

你介意发布一些代码来看看为什么它返回一个空的范围吗?以下代码按预期工作(我复制/粘贴了您的代码)。

代码语言:javascript
复制
        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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4987833

复制
相关文章

相似问题

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