我正在准备 MS 考试 70-483 (C#),我突然想到了这个想法。
是否可以做这样的事情:
class Person
{
public string Name { get; set; }
public int CityId { get; set; }
}
class City
{
public string Name { get; set; }
public int Id { get; set; }
}
/* 假设代码用于填充列出人员和列出城市 */
var personsByCity = from p in people join c in cities
on p.CityId equals c.Id
select new { PersonName = p.Name, CityName = c.Name,
ToString = Func<string>( () => { return PersonName + "/" +
CityName; })};
出现的编译器错误是“[CS0119]表达式表示一个类型”,其中需要一个
变量或“方法组”。
Resharper 更清楚一点:委托(delegate)名称此时无效(即 Func 发生的位置)。
那么,有没有办法在 LINQ 查询中向匿名类型添加函数?
最佳答案
是的,您可以声明一个函数,但您不能将其定义为返回当前正在声明的匿名类型的属性 - 例如,如果您要使用 this
, lambda 将捕获声明上下文(包含正在执行 LINQ 的代码的类)中的 this
值。不过,您可以捕获用于初始化匿名类的值(正如我在下面的示例中所做的那样)。
请注意,这与与为匿名类提供方法不同。匿名类只能具有只读、不可变的属性。在这种情况下,您的匿名类仍将具有从 object
继承的原始 ToString()
方法。这可能会使其tricky to distinguish the function held in the ToString
property from the ToString()
method ,所以也许您应该使用不同的名称。
此外,您忘记了 Func
之前的 new
关键字。
var personsByCity = from p in people join c in cities on p.CityId equals c.Id
select new
{
PersonName = p.Name,
CityName = c.Name,
ToString = new Func<string>( () => {
return c.Name + "/" + p.Name;
})
};
关于linq - 我可以在 LINQ select 子句中声明函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49890111/