在 C 中初始化 IEnumerable<string>#

Initializing IEnumerable<string> In C#

提问人:markzzz 提问时间:7/4/2011 最后编辑:Kirill Polishchukmarkzzz 更新时间:6/12/2023 访问量:308220

问:

我有这个对象:

IEnumerable<string> m_oEnum = null;

我想初始化它。尝试过

IEnumerable<string> m_oEnum = new IEnumerable<string>() { "1", "2", "3"};

但它说“IEnumerable 不包含添加字符串的方法。有什么想法吗?谢谢

C# .net

评论


答:

122赞 Bas 7/4/2011 #1

IEnumerable<T>是一个接口。您需要从具体类型(实现)开始。例:IEnumerable<T>

IEnumerable<string> m_oEnum = new List<string>() { "1", "2", "3"};
7赞 BonyT 7/4/2011 #2

不能实例化接口 - 必须提供 IEnumerable 的具体实现。

评论

0赞 Mark Schultheiss 10/10/2022
感觉更像是评论,而不是所说的答案。
39赞 Bob Vale 7/4/2011 #3

如实现 IEnumerablestring[]

IEnumerable<string> m_oEnum = new string[] {"1","2","3"}
23赞 ChrisF 7/4/2011 #4

IEnumerable只是一个接口,因此不能直接实例化。

您需要创建一个具体的类(例如List)

IEnumerable<string> m_oEnum = new List<string>() { "1", "2", "3" };

然后,您可以将其传递给任何需要 .IEnumerable

251赞 sehe 7/4/2011 #5

好的,补充您可能在寻找的答案

IEnumerable<string> m_oEnum = Enumerable.Empty<string>();

IEnumerable<string> m_oEnum = new string[]{};

评论

4赞 Joel Coehoorn 10/5/2018
现在老了,但我会避免第二种选择。您可能希望它与与数组不兼容的其他 IEnumerable 进行交互。
1赞 Carlo Bos 11/16/2021
有时需要将其强制转换为 IEnumerable。那么像这样的语句就可以了:(IEnumerable<string>)new [] {"1", "2", "3"}
19赞 Kirill Polishchuk 7/4/2011 #6
public static IEnumerable<string> GetData()
{
    yield return "1";
    yield return "2";
    yield return "3";
}

IEnumerable<string> m_oEnum = GetData();

评论

13赞 Adriano Carneiro 7/4/2011
虽然有点矫枉过正,但使用产量+1
5赞 5argon 2/13/2018
@AdrianCarneiro +1 押韵
5赞 yan yankelevich 10/5/2018 #7

您可以创建一个静态方法,该方法将返回所需的 IEnumerable,如下所示:

public static IEnumerable<T> CreateEnumerable<T>(params T[] values) =>
    values;
//And then use it
IEnumerable<string> myStrings = CreateEnumerable("first item", "second item");//etc..

或者,只需执行以下操作:

IEnumerable<string> myStrings = new []{ "first item", "second item"};
8赞 Alexander Oh 8/12/2020 #8

IEnumerable 是一个接口,而不是寻找如何创建接口实例,而是创建与接口匹配的实现:创建列表或数组。

IEnumerable<string> myStrings = new [] { "first item", "second item" };
IEnumerable<string> myStrings = new List<string> { "first item", "second item" };

评论

0赞 tobbenb3 7/14/2022
最简单的:new[] {...}
0赞 Adnan 6/12/2023 #9

这是通过使用 new in 中实现此目的的方法。global usingc# 10

// this makes EnumerableHelpers static members accessible 
// from anywhere inside your project.
// you can keep this line in the same file as the helper class,
// or move it to your custom global using file.
global using static Utils.EnumerableHelpers;

namespace Utils;

public static class EnumerableHelpers
{
    /// <summary>
    /// Returns only non-null values from passed parameters as <see cref="IEnumerable{T}"/>.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="values"></param>
    /// <returns><see cref="IEnumerable{T}"/> of non-null values.</returns>
    public static IEnumerable<T> NewEnumerable<T>(params T[] values)
    {
        if (values == null || values.Length == 0) yield break;

        foreach (var item in values)
        {
            // I added this condition for my use case, remove it if you want.
            if (item != null) yield return item;
        }
    }
}

以下是如何使用它:

// Use Case 1
var numbers = NewEnumerable(1, 2, 3);

// Use Case 2
var strings = NewEnumerable<string>();
strings.Append("Hi!");