首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有Union和Take的Enumerable.Repeat不返回“Take”值

具有Union和Take的Enumerable.Repeat不返回“Take”值
EN

Stack Overflow用户
提问于 2012-11-21 18:51:09
回答 2查看 375关注 0票数 3

很简单的问题。我有一个值列表,我想用空值填充这些值,这样我总是返回X个数的项。

代码语言:javascript
复制
List<int> list = new List<int>() { 10, 20, 30 };

IEnumerable<int> values = list
     .OrderByDescending( i => i )
     .Union( Enumerable.Repeat( 0 , 5 ) );

foreach (var item in values.Take(5))
   Console.Write( item + " ");

我期望得到类似于"30 20 10 0 0“的输出,但令人惊讶的是,我只得到了"30 20 10 0”。

代码语言:javascript
复制
foreach (var i in Enumerable.Repeat( 0, 5 ).Take(3))
    Console.Write( i + " " );

此代码将返回"0 0 0“。同样,"list.Take(3)“返回”302010“。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-21 18:54:15

原因是Enumerable.Union删除了重复项。所以你可能想用Enumerable.Concat来代替,因为它不会删除重复的东西。

我更喜欢的另一个选择是使用Enumerable.ElementAtOrdefaultEnumerable.Range创建的索引中选择元素,其中第二个参数是所需的计数:

代码语言:javascript
复制
IEnumerable<int> values = Enumerable.Range(0, 5)
            .Select(i => list.ElementAtOrDefault(i))
            .OrderByDescending(i => i);
票数 5
EN

Stack Overflow用户

发布于 2012-11-21 18:54:08

作为一种集合论操作,并集的概念有一个隐含的“独特”。如果您不希望这样:请使用Concat而不是Union

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

https://stackoverflow.com/questions/13491642

复制
相关文章

相似问题

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