匿名类型,和伟大的未知

时间:2014-08-21 03:59:47

标签: c# linq lambda anonymous-types

我正在尝试显式定义 Anonymous Type 内容,但每次尝试访问数据时都会收到错误:不包含参数的定义或扩展方法。< / em>有人可以向我解释,为什么?

params string[] content;
var log = content.Select(obj => new {
     Date = obj.Contains("Date"),
     Title = obj.Contains("Title"),
     Priority = obj.Contains("Priority"),
     Message = obj.Contains("Message")
});

现在,如果我尝试拨打log.Date特定消息会出现,为什么?我怎么能正确地做到这一点?

4 个答案:

答案 0 :(得分:4)

这是因为这里的日志是IEnumerable。试试这个

var logs = content.Select(obj => new {
     Date = obj.Contains("Date"),
     Title = obj.Contains("Title"),
     Priority = obj.Contains("Priority"),
     Message = obj.Contains("Message")
});

foreach (var log in logs)
{
    log.Date;
}

要避免foreach意味着您只需要IEnumerable中的一个特定项目,如果它是您需要的第一个项目,则可以使用First()扩展名。

logs.First();

否则,您可以使用通常的索引,就像使用数组一样

答案 1 :(得分:3)

Log是一个可枚举的:

foreach (var o in log) {
    bool date = o.Date;
}

答案 2 :(得分:3)

在这种情况下,

log是匿名类型的IEnumerable。所以log它自己没有Date成员,但log中的项目有:

var dateOfFirstItem = log.First().Date;

如果你确定content中至少有一个项目,你可以这样做:

var log = content.Select(obj => new {
     Date = obj.Contains("Date"),
     Title = obj.Contains("Title"),
     Priority = obj.Contains("Priority"),
     Message = obj.Contains("Message")
}).First();
var date = log.Date
var title = log.Title
....

答案 3 :(得分:0)

Select子句返回IEnumerable,因此如果您确定内容对象的选择只返回一个元素,则可以使用SingleOrDefault()函数,如下所示:

var log = content.Select(obj => new {
     Date = obj.Contains("Date"),
     Title = obj.Contains("Title"),
     Priority = obj.Contains("Priority"),
     Message = obj.Contains("Message")
}).SingleOrDefault();