Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';将一项添加到IEnumerable的最佳方式<;T>;?_C#_Extension Methods_Ienumerable - Fatal编程技术网

C# 什么';将一项添加到IEnumerable的最佳方式<;T>;?

C# 什么';将一项添加到IEnumerable的最佳方式<;T>;?,c#,extension-methods,ienumerable,C#,Extension Methods,Ienumerable,下面是我将如何向IEnumerable对象添加一项: //Some IEnumerable<T> object IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" }; //Add one item arr = arr.Concat(new string[] { "JKL" }); //某个IEnumerable对象 IEnumerable arr=新字符串[]{“ABC”、“DEF”、“GHI”}

下面是我将如何向IEnumerable对象添加一项:

//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };

//Add one item
arr = arr.Concat(new string[] { "JKL" });
//某个IEnumerable对象
IEnumerable arr=新字符串[]{“ABC”、“DEF”、“GHI”};
//添加一项
arr=arr.Concat(新字符串[]{“JKL”});
这很尴尬。但是,我没有看到像
ConcatSingle()
这样的方法


是否有更简洁的方法将单个项添加到IEnumerable对象?

IEnumerable
是不可变的集合,这意味着您无法添加或删除项。相反,您必须为此创建一个新集合,只需转换为列表即可添加:

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added

编写扩展方法
ConcatSingle
:)

如您所见,原始枚举(我们保存在
原始
中)没有更改。

由于是只读的,您需要转换为列表

var new_one = arr.ToList().Add("JKL");
或者你可以得到一个喜欢的

公共静态IEnumerable追加(此IEnumerable源,参数T[]项)
{
返回来源:Concat(项目);
}

不,这与您使用内置语言/框架功能所获得的简洁性差不多

如果愿意,您可以始终创建扩展方法:

arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");

// ...

public static class EnumerableExtensions
{
    public static IEnumerable<T> Append<T>(
        this IEnumerable<T> source, params T[] tail)
    {
        return source.Concat(tail);
    }
}
arr=arr.Append(“JKL”);
//或
arr=arr.Append(“123”、“456”);
//或
arr=arr.Append(“MNO”、“PQR”、“STU”、“VWY”、“etc”和“…”);
// ...
公共静态类EnumerableExtensions
{
公共静态IEnumerable追加(
此IEnumerable源,参数T[]尾)
{
返回源Concat(tail);
}
}

您正在将数组分配给IEnumerable。为什么不使用数组类型而不是IEnumerable

否则,如果要更改集合,可以使用IList(或List)

我只在需要读取方法参数时使用IEnumerable,在需要更改其中的项时使用IList(或List)。

Append()
-正是您需要的,它已添加到.NET标准中(2017年),因此您不再需要编写自己的扩展方法。您可以简单地执行以下操作:

arr=arr.Append(“JKL”)

由于.NET是开源的,因此您可以在这里查看实现(它比上面建议的自定义方法更复杂):

@Chris:我把那卷卷回去了。此功能已从SO中删除是有原因的。未意识到此功能已添加。感谢您的更正。
IEnumerable
是只读的。这并不意味着它是一成不变的。不可变的集合是一个永远不会改变的集合。
IEnumerable
甚至不能保证引用不能被类型转换为可变类型,更不用说基础集合不会改变。也许我遗漏了什么……但是Add不会返回新列表……
Add
不会返回新列表,但是因为
list
是一个可变集合,您可以简单地引用
list
对象来访问“新列表”。从这个意义上说,这个答案有点迂腐(因为最明显的是OP是在问如何从另一个
IEnumerable
和一个附加对象创建一个新的
IEnumerable
。>
IEnumerable
是不可变的集合——这是错误的,它不是集合,而是接口。实现它的类的对象可能是不可变的(如数组)或可变的(如列表),这取决于实现。System中有这样的方法。Linq Namespace非常有趣,谢谢。新的.Net版本似乎正在将链表附加到给定IEnumerable的开头和结尾。
var new_one = arr.ToList().Add("JKL");
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
    return source.Concat(item);
}
arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");

// ...

public static class EnumerableExtensions
{
    public static IEnumerable<T> Append<T>(
        this IEnumerable<T> source, params T[] tail)
    {
        return source.Concat(tail);
    }
}