gpt4 book ai didi

c# - 如何使用扩展方法使集合成为 "n"元素长?

转载 作者:太空狗 更新时间:2023-10-30 00:42:44 26 4
gpt4 key购买 nike

所以,这是我的问题,我有一个给定的对象,它是一个 IEnumerable 并且我已经保证该集合将始终最多包含 4 个元素。现在,出于一个不重要的原因,我希望能够以某种优雅的方式“强制”集合包含 4 个元素(如果元素少于 4 个的话)。

我已经做了一些研究,最有说服力的候选者是 Zip,但它在到达最短集合的末端后停止压缩。

有没有办法在不创建自己的扩展方法的情况下做到这一点?为了更好地解释我自己:

var list1 = new List<Dog> {
new Dog { Name = "Puppy" }
}
var list2 = new List<Dog> {
new Dog { Name = "Puppy1" },
new Dog { Name = "Puppy2" },
new Dog { Name = "Puppy3" },
new Dog { Name = "Puppy4" },
}

var other1 = list1.ExtendToNElements(4).ToList();
//Now other1's first element is an instance of Dog with Name = "Puppy"
//And the following 3 elements are null, or have a Dog with no name
//I don't really care about that

var other2 = list2.ExtendToNElements(4).ToList();
//other2 is the same as list2, nothing got added.

提前致谢!

最佳答案

快速一行(这应该算作“无需扩展方法就可以”):

public static IEnumerable<TItem> Extend<TItem>(
this IEnumerable<TItem> source,
int n)
{
return source.Concat(Enumerable.Repeat(default(TItem), n))
.Take(n);
}

由于 Repeat 需要明确的计数,因此传入 n 会给出一个合理的上限。无论如何,元素都是按需生成的。使用 source.Count() 会强制执行 source,这并不理想。

稍微过度设计和灵活的版本:

public static IEnumerable<TItem> Extend<TItem>(
this IEnumerable<TItem> source,
int n,
Func<TItem> with)
{
return source.Concat(
from i in Enumerable.Range(0, n) select with()
).Take(n);
}

public static IEnumerable<TItem> Extend<TItem>(
this IEnumerable<TItem> source,
int n,
TItem with = default(TItem))
{
return source.Extend(n, with: () => with);
}

关于c# - 如何使用扩展方法使集合成为 "n"元素长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com