我希望你能为这个做法提供一个良好的标准方式,然而每次我参与的项目都需要编写自己的Unity方法或创建内联数组等。
(我希望这个问题很快就会被关闭,因为已经有一些关于这个问题的优秀答案了)
(我希望这个问题很快就会被关闭,因为已经有一些关于这个问题的优秀答案了)
一种简单的方法:
var singleElementSequence = Enumerable.Repeat(value, 1);
或者您可以在未受限制的泛型类型上编写自己的扩展方法(诚然,这通常是一个不好的主意...请谨慎使用):
public static IEnumerable<T> ToSingleElementSequence<T>(this T item)
{
yield return item;
}
用法:
IEnumerable<String> sequence = "foo".ToSingleElementSequence();
Enumerable.Repeat
:)yield
是个好主意。这会导致编译器为仅有一个元素的情况生成全新的枚举器实现和相关状态机。只需使用 return new[] { item };
即可避免所有繁重的代码生成,而且不会产生任何额外的分配。 - SvenIEnumerable <T>
,从而避免状态机和易于访问的底层数组。然而,在正常情况下,我真的不认为这样做有太多好处,但是如果我为广泛使用的框架编写此函数,我可能会考虑这样的妥协以获取潜在微小的效率提升。 - Briannew T[]{value}
new [] {value}
,在此情况下可以省略类型。请注意,我会尽力使翻译流畅易懂,但不会更改原意或添加解释。 - gofal3编辑:我想提到一些我在LINQ中最喜欢的设备:
internal static IEnumerable<T> Concat<T>(params T[] objs)
{
return objs;
}
internal static IEnumerable<T> Concat<T>(this IEnumerable<T> e, params T[] objs)
{
return e.Concat(objs);
}
internal static IEnumerable<T> Concat<T>(this IEnumerable<T> e, params IEnumerable<T>[] seqs)
{
foreach (T t in e) yield return t;
foreach (var seq in seqs)
foreach (T t in seq) yield return t;
}
// this allows you to
var e1 = Concat(1,2,3); // 1,2,3
var e2 = e1.Concat(4,5,6); // 1,2,3,4,5,6,
var e3 = e2.Concat(e2, e1, Concat(42)); // 1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,42
IEnumerable<int> = new [] {42};
internal static IEnumerable<T> Enumerable<T>(this T obj)
{
yield return obj;
}
//
var enumerable = 42.Enumerable();
public static class IEnumerableExt
{
// usage: someObject.AsEnumerable();
public static IEnumerable<T> AsEnumerable<T>(this T item)
{
yield return item;
}
}