从C#中的可枚举值中准确获取x值的最佳方法是什么?如果我像这样使用可枚举的.Take():
var myList = Enumerable.Range(0,10);
var result = myList.Take(20);
结果将只有10个元素。
我想用缺省值填充缺少的条目。如下所示:
var myList = Enumerable.Range(0,10);
var result = myList.TakeOrDefault(20, default(int)); //Is there anything like this?
C#中有这样的功能吗?如果没有,实现这一功能的最佳方式是什么?
发布于 2015-07-27 23:00:12
缺省情况下它不在那里,但是作为扩展方法编写它已经足够简单了
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;
}
}
发布于 2015-07-27 23:09:32
您正在寻找的是一个通用的PadTo
方法,如果需要,它可以使用给定值扩展集合的长度。
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();
}
现在,您可以表达:
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])
发布于 2015-07-27 22:59:58
您可以使用Concat
来实现此目的。您可以使用一个简单的helper方法将所有这些连接在一起:
public IEnumerable<T> TakeSpawn(this IEnumerable<T> @this, int take, T defaultElement)
{
return @this.Concat(Enumerable.Repeat(defaultElement, take)).Take(take);
}
这个想法是,您总是将另一个enumerable追加到原始enumerable的末尾,因此如果输入没有足够的元素,它将从Repeat
开始枚举。
https://stackoverflow.com/questions/31656460
复制相似问题