创建一个新的匿名类型列表并将其合并到现有的匿名类型列表中。

7

我有一个匿名类型列表,这些类型是从我的数据库中获取的:

var takenChannels = (from b in bq.GetStuff(db)
                     where b.RecordType == "H" && b.TourStartDateTime.Date == date
                     select new { Start = b.TourStartDateTime, End = b.TourEndDateTime, Channel = b.RadioChannel, TourArea = b.TourArea }).ToList();

然后我使用这个列表信息在foreach循环中进行一些操作。当我下一次循环时,我想要向该列表添加一个新的匿名项。

类似于以下内容:

takenChannels.Union{new[] { new{Start = DateTime.Now, End = DateTime.Now.AddDays(1), Channel = 25, TourArea = "Area" }});

显然这样不行。我该怎么做?
编辑1:
takenChannels.Add(new { Start = s, End = e, Channel = channel, TourArea = booking.TourArea });

这是我到目前为止最接近的翻译(感谢Daniel)... 但我得到的错误是:

错误6 参数1:无法从“AnonymousType#2”转换为“AnonymousType#1”


2
显然这个不起作用。不,这并不明显。它会生成错误吗?如果是的话,是什么错误?我不会怀疑它不起作用。请注意,Union不会改变列表,它会创建一个新序列,因此您需要将其分配给某个变量以观察结果。 - Servy
抱歉,我一直在搞我的代码。那里混杂着两个尝试性的解决方案。我已经编辑了我的问题。 - Smithy
2
属性的类型必须不匹配。也许其中一个在某个地方是字符串,在另一个地方是整数,或者类似的情况。如果您确保具有完全相同的名称和完全相同的类型的相同属性,则它将正常工作。 - Servy
1
Spot on、RadioChannel 和 EndDateTime 均为可空值。非常感谢 @Servy :) - Smithy
2个回答

13

这个答案可能有点晚,但既然这是我在谷歌搜索同样问题时找到的问题,我认为应该用一个可行的答案来完成它。

匿名类型可以多次进行Union操作而不会出现问题。重要的是所有属性都在所有实例中声明,并且它们具有相同的数据类型。如果不是,则会得到上面的错误。

  • 在您的特定情况下,数据库是否返回TourStartDateTimeTourEndDateTime作为DateTime?
  • RadioChannel是否来自数据库的int,或者可能是int?string
  • TourArea是否在数据库中作为string

只需确保数据类型匹配即可。以下是我在我的程序中使用的可行代码片段:

var regions = (
    new[] { new { Id = "-1", Name = "---", Pattern = (string)null } }
  ).Union(
    from x in db.Userlists where x.ListType == 2 select new { Id = x.UserlistID.ToString(), Name = x.Name, Pattern = (string)null }
  ).Union(
    from x in db.Lookups where x.Category == "Stock" select new { Id = x.Key, Name = x.Key, Pattern = x.Value }
  ).ToArray();

非常感谢你,Mattias。 - Amin Sayed

4

您可以简单地将Add添加到列表中:

takenChannels.Add(new { Start = ... });

1
我可以添加... 确保您添加的匿名类型对象的名称和类型与列表项相同。 - Les

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接