【问题标题】:Convert LINQ method syntax with method withing .Select() to LINQ query syntax将带有 .Select() 的方法的 LINQ 方法语法转换为 LINQ 查询语法
【发布时间】:2015-06-15 00:41:08
【问题描述】:

我目前有以下代码:

dataSource.Where(row => row.Value == 1)
          .Select(row => {row["Text"] = translatedText; return row;})
          .Single();

所以我的目标是选择“Value=1”的 DataRow,同时将“Text”列中的值设置为其他值(在我的例子中是字符串变量 transalatedText)。

上面提到的方法链已经可以很好地工作了,但我通常更喜欢 LINQ 语法。是否有可能将此方法链转换为 LINQ?

我的问题是我不知道如何将 Select 方法中的函数转换为 LINQ 格式。我不想创建一个新的 DataRow,但想真正编辑选定的 DataRow。 (所以我不想使用from x in y where z select new DataRow(...),但如果可能的话,我真的要编辑我的x

谢谢!

【问题讨论】:

    标签: c# .net linq select lambda


    【解决方案1】:

    是否有可能将此方法链转换为 LINQ?

    (“to LINQ”我相信您的意思是“查询表达式语法”。)

    不直接,不。实际上,您只能将表达式主体的 lambda 表达式转换为查询语法。这是有充分理由的:LINQ 的设计有副作用,而您的“查询”确实有副作用。

    我会亲自这样编写您的代码:

    var row = DataSource.Single(row => row.Value == 1);
    row["Text"] = translatedText;
    

    这巧妙地将查询与副作用分开。如果你真的,真的想使用查询表达式语法,你可以写:

    var query = (from row in DataSource
                 where row.Value == 1)
                 select HorribleMutatingMethod(row)).Single();
    ...
    
    private DataRow HorribleMutatingMethod(DataRow row)
    {
        row["Text"] = translatedText;
        return row;
    }
    

    ...但请不要。

    【讨论】:

    • 是的,我的意思是“查询表达式语法”,谢谢。您的解决方案适用于我的情况,但我想尽可能将问题保持为“一般”(例如,使用 Where(row => new []{1, 2, 3}.Contains(row.值)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多