linq - 我可以在 LINQ select 子句中声明函数吗?

标签 linq select func

我正在准备 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/

相关文章:

c# - 字符串拆分并将结果分布在不同的数组中

linq - 如何将 2 个不同的 IQueryable/List/Collection 与相同的基类结合起来? LINQ 联合和协方差问题

php - 如何使用不带按钮和 JavaScript 的选择框加载数据库内容

mysql - 如何使用 HQL 连接提供额外参数

r - 使用 NSE 在函数中调用 ggplot

c# - 无法将返回值类型的方法分配给 Func<dynamic>

C# - 设计问题建议 : Can't Use Dictionary then what?

c++ Socket选择接收问题

c# - 如何使用 EF.Functions 评估 Func<T, bool>?

c# - 如何用 LinQ 对自定义对象求和?