首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用默认值的C# Enumerable.Take

使用默认值的C# Enumerable.Take
EN

Stack Overflow用户
提问于 2015-07-27 22:56:24
回答 6查看 4.8K关注 0票数 20

从C#中的可枚举值中准确获取x值的最佳方法是什么?如果我像这样使用可枚举的.Take():

代码语言:javascript
复制
var myList = Enumerable.Range(0,10);
var result = myList.Take(20);

结果将只有10个元素。

我想用缺省值填充缺少的条目。如下所示:

代码语言:javascript
复制
var myList = Enumerable.Range(0,10);
var result = myList.TakeOrDefault(20, default(int));  //Is there anything like this?

C#中有这样的功能吗?如果没有,实现这一功能的最佳方式是什么?

EN

回答 6

Stack Overflow用户

发布于 2015-07-27 23:00:12

缺省情况下它不在那里,但是作为扩展方法编写它已经足够简单了

代码语言:javascript
复制
public static IEnumerable<T> TakeOrDefault<T>(this IEnumerable<T> items, int count, T defaultValue)
{
    var i = 0;
    foreach(var item in items)
    {
        i++;
        yield return item;
        if(i == count)
             yield break;
    }
    while(i++<count)
    {
        yield return defaultValue;
    }
}

现场示例:http://rextester.com/XANF91263

票数 11
EN

Stack Overflow用户

发布于 2015-07-27 23:09:32

您正在寻找的是一个通用的PadTo方法,如果需要,它可以使用给定值扩展集合的长度。

代码语言:javascript
复制
public static IEnumerable<T> PadTo<T>(this IEnumerable<T> source, int len)
{
    return source.PadTo(len, default(T));
}

public static IEnumerable<T> PadTo<T>(this IEnumerable<T> source, int len, T elem)
{
    return source.PadTo(len, () => elem);
}

public static IEnumerable<T> PadTo<T>(this IEnumerable<T> source, int len, Func<T> elem)
{
    int i = 0;
    foreach(var t in source)
    {
        i++;
        yield return t;
    }

    while(i++ < len)
        yield return elem();
}

现在,您可以表达:

代码语言:javascript
复制
myList.Take(20).PadTo(20);

这类似于Scala的[List[A].padTo](http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List@padTo(len:Int,elem:A%29:List[A])

票数 5
EN

Stack Overflow用户

发布于 2015-07-27 22:59:58

您可以使用Concat来实现此目的。您可以使用一个简单的helper方法将所有这些连接在一起:

代码语言:javascript
复制
public IEnumerable<T> TakeSpawn(this IEnumerable<T> @this, int take, T defaultElement)
{
  return @this.Concat(Enumerable.Repeat(defaultElement, take)).Take(take);
}

这个想法是,您总是将另一个enumerable追加到原始enumerable的末尾,因此如果输入没有足够的元素,它将从Repeat开始枚举。

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

https://stackoverflow.com/questions/31656460

复制
相关文章

相似问题

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