从单个值创建新的IEnumerable<T>序列的最佳方法是什么?

108

我通常使用数组语法从单个值创建序列,例如:

IEnumerable<string> sequence = new string[] { "abc" };

或者使用一个新的List。我想听听是否有更具表现力的方法来完成相同的事情。


3
那怎么会是一个空序列呢? - CoderDennis
1
很尴尬的是,dotnet仍然没有类似于Enumerable.From<T>(params T[] items)这样的东西。 - Good Night Nerd Pride
4个回答

154

你的例子不是一个空序列,而是一个只有一个元素的序列。要创建一个空的字符串序列,可以执行以下操作:

var sequence = Enumerable.Empty<string>();

编辑 OP澄清他们正在寻求创建单个值。在这种情况下

var sequence = Enumerable.Repeat("abc",1);

哎呀,我分心了,抱歉。我的意思是从单个值创建,而不是创建一个空实例! - Marcel Lamothe
这是“答案”,标记它吗? - n8wrl
这种方法比创建一个新数组更加纯粹的函数式。 - Roy Tinker

78

我喜欢你所建议的,但省略了数组类型:

var sequence = new[] { "abc" };

4
我从未意识到你可以这样做。我认为这比使用“重复”更清晰。 - Marcel Lamothe
2
但这不是一个IEnumerable,它是一个数组! - Zodman
6
我知道,但它是一个IEnumerable的具体实现。问题要求一个IEnumerable<>(即使示例不是)。这是有区别的。 - Zodman
也许应该改变问题。 - Zodman
1
@Jonesopolis:那是一个不同的、无关的情况。你可以使用Task.FromResult来实现这一点。 - Bryan Watts
显示剩余3条评论

25
甚至可以更简短,
string[] single = { "abc" };

我会编写一个扩展方法:

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

甚至更好、更简短的方法是只需:

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

也许这正是Enumerable.Repeat在幕后所做的事情。

1
最后一个很棒。除了名称...它会与已经实现IEnumerable的类型(例如您示例中的字符串)发生冲突。尝试使用.AsSingleItemEnumerable(),或者简单地使用.Yield() --> "abc".Yield() - DanO
8
我认为使用 ToEnumerable 更合适。 - Zodman
2
+1 Yield 很好。我也制作了 IEnumerable<T> Yield<T>(this T source, params T[] others) - Jodrell
@PeterSchneider 你是怎么做到的?为什么要这样做?没有看到代码我无法评论。我不认为我理解你的意思。 - nawfal
1
今天我只是无缘无故地玩了一下。我想将(item) => yield return item;传递给一个期望IEnumerable的函数,或者定义一个Func<IEnumerable<item>> = () => yield return 1;之类的东西。但是由于我指出的原因,在接受的答案中提到,这是不可能的。 - Peter - Reinstate Monica
显示剩余2条评论

8

或者只需创建一个方法

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

或者

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

使用方法:

IEnumerable<string> items = CreateEnumerable("single");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接