我有以下代码:
var data= from row in table.AsEnumerable()
group row by row.Field<string>("id") into g
select new { Id= g.Key };
我想在数据变量中再添加一个元素。我该怎么做?(是否有类似数据的东西。Concat(1(etc
如果你想添加一个额外的Id,你确实可以连接它:
data = data.Concat( new [] { new { Id= "1" } });
这是因为以相同顺序具有相同字段的匿名类型会被编译为相同的类型。
您可以将LINQ结果作为List<string>
返回。泛型列表可以更容易地Add
。
var data = (from row in table.AsEnumerable()
group row by row.Field<string>("id") into g
select new { Id = g.Key }).ToList();
data.Add(new { Id = "X" });
通过这种方式,您将不需要声明另一个变量来保存带有新项的Enumerable
(因为Enumerable
是不可分割的,并且不能向自身添加新项(。
编辑:
与pointed一样,将Enumerable<T>
更改为List<T>
将在内存中放置并保持所有元素,这不是一种好的性能方法。
要使用Enumerable<T>
,您可以执行以下操作:
data = data.Concat(new [] { new { Id = "X" } });
因为Enumerable<Anonymous>
可以放置在其内部。
我不知道如何使用查询语法,但您可以通过使用单个项创建一个新的值数组来使用具有单个值的Concat
:
IEnumerable<int> data = GetData()
.Concat(new[] { "5" });
简单地做这件事的问题是,你的数据是IEnumerable<AnonymousType>
,你不能简单地更新它,而且我认为新的匿名类型彼此不兼容。(编辑:根据BrokenGlass的说法,它们是兼容的。你可以试试他的解决方案(。
如果它们不兼容,可以将该项连接到Select
子句之前,但同样,如何创建该类型的项。
解决方案可能是先选择IEnumerable<string>
,concat,然后重新选择匿名类型:
var data = (from row in table.AsEnumerable()
group row by row.Field<string>("id") into g
select g.Key)
.Concat(new[] { "5" })
.Select(k => new { Id = key });
或者为结果创建一个新的命名结构,并连接其中一个:
var data = from row in table.AsEnumerable()
group row by row.Field<string>("id") into g
select new MyCustomResult() { Id = g.Key };
data = data.Concat(new MyCustomResult() { Id = "5" });
您需要将匿名类型更改为已知类型,然后添加该新元素。
// ...
select new MyResultClass { Id = g.Key };
data.Add(new MyResultClass { Id = 4 });