我有以下代码:
var data= from row in table.AsEnumerable()
group row by row.Field<string>("id") into g
select new { Id= g.Key };
我想在数据变量中再添加1个元素。我该怎么办? (有没有像data.Concat(1)等
答案 0 :(得分:4)
如果您想添加额外的ID,您确实可以连接它:
data = data.Concat( new [] { new { Id= "1" } });
这是有效的,因为具有相同顺序的相同字段的匿名类型被编译为相同的类型。
答案 1 :(得分:2)
您可以将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
是不可变的,并且无法向其自身添加新项目。)
修改强>
如同指出的那样,将Enumerable<T>
更改为List<T>
会将所有元素放在内存中,这不是一个好的性能方法。
要继续使用Enumerable<T>
,您可以:
data = data.Concat(new [] { new { Id = "X" } });
因为Enumerable<Anonymous>
可以置于其中。
答案 2 :(得分:1)
我不知道如何使用查询语法,但是您可以通过使用单个项创建一个新的值数组来将Concat
与单个值一起使用:
IEnumerable<int> data = GetData()
.Concat(new[] { "5" });
这样做的问题很简单,就是你的数据是IEnumerable<AnonymousType>
,你不能简单地新建,我不认为新的匿名类型是相互兼容的。 (编辑:根据BrokenGlass,它们是兼容的。您可以尝试使用他的解决方案。)
如果它们不兼容,您可以在Select
子句之前连接该项目,但同样,如何创建该类型的项目。
解决方案可能是首先选择IEnumerable<string>
,连续,然后重新选择您的匿名类型:
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" });
答案 3 :(得分:0)
您需要从匿名类型更改为已知类型,然后添加该新元素。
// ...
select new MyResultClass { Id = g.Key };
data.Add(new MyResultClass { Id = 4 });