Enumerable.Repeat with Union和Take不返回'Take'值

Ian*_*ley 3 c# linq ienumerable

非常简单的问题.我有一个值列表,我想用空值填充,以便我总是返回X个项目.

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 + " ");
Run Code Online (Sandbox Code Playgroud)

我希望输出像"30 20 10 0 0"但令人惊讶的是我只得到"30 20 10 0".

foreach (var i in Enumerable.Repeat( 0, 5 ).Take(3))
    Console.Write( i + " " );
Run Code Online (Sandbox Code Playgroud)

此代码将返回"0 0 0".同样地," list.Take(3)"返回"30 20 10".

Mar*_*ell 5

作为集理论运算的联合概念具有隐含的"不同".如果您不想这样:使用Concat而不是Union.


Tim*_*ter 5

原因是Enumerable.Union删除重复.因此,您可能希望使用Enumerable.Concat哪个dsoes不会删除重复项.

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

IEnumerable<int> values = Enumerable.Range(0, 5)
            .Select(i => list.ElementAtOrDefault(i))
            .OrderByDescending(i => i);
Run Code Online (Sandbox Code Playgroud)

  • @IanQuigley SQL`union`也有一个隐含的不同**.要避免它,你需要使用`UNION ALL`(然后是:concat) (2认同)