如何将类型T的单个值转换为IEnumerable <t>?</t>

时间:2011-06-21 09:44:54

标签: c# .net linq ienumerable

必须有一个很好的标准方法来做到这一点,但是我工作的每个项目都必须编写自己的统一方法,或者创建一个内联数组等。

(我希望这会很快被关闭作为一个问题的副本,并附上一些很好的答案)

4 个答案:

答案 0 :(得分:18)

一个简单的方法:

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:)

答案 1 :(得分:4)

编辑想到在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();

答案 2 :(得分:4)

最短的路是

new T[]{value}

答案 3 :(得分:2)

您可以定义自己的扩展方法:

public static class IEnumerableExt
{
    // usage: someObject.AsEnumerable();
    public static IEnumerable<T> AsEnumerable<T>(this T item)
    {
        yield return item; 
    }
}

.NET框架中没有任何内容可以执行此任务。