c#linq filter plus concat

时间:2011-05-03 17:36:29

标签: c# .net linq

我有以下代码:

    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)等

4 个答案:

答案 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 });