【问题标题】:Does C# 7 allow to deconstruct tuples in linq expressionsC# 7 是否允许在 linq 表达式中解构元组
【发布时间】:2017-04-15 10:36:58
【问题描述】:

我正在尝试解构 Linq 表达式中的元组

// somewhere inside another method
var result = from word in words
             let (original, translation) = Convert(word)
             select original

这是返回元组的方法的签名

(string Original, string Translation) Convert(DictionaryWord word)
{
    // implementation
}

但这不是一个有效的语法。我只能在不解构的情况下访问元组值:

var result = from word in words
             let result = GetWord(word, mode)
             select result.Original

是否有适当的方法来解构它,或者它在 Linq 表达式中不受支持?

【问题讨论】:

  • 很遗憾,LINQ 集成在 C# 7 中没有经过深思熟虑。

标签: c# linq tuples c#-7.0


【解决方案1】:

好像没有。

GitHub 上有一个未解决的问题:https://github.com/dotnet/roslyn/issues/6877

编辑

问题已移至dotnet/csharplang#355

【讨论】:

【解决方案2】:

C# 7.0 不支持 Linq 查询中的解构。

只有三种形式的解构进入 C# 7.0(赋值中的解构、“foreach”循环和“for”循环中的解构)。 但是,当语言设计委员会考虑了所有可能声明变量的位置(因此将成为解构的候选者)并确定它们的优先级时,“let”(也可能是“from”)子句中的解构是紧随其后的。

如果您觉得这对您有用,请务必在 https://github.com/dotnet/csharplang/issues/189 上留言或竖起大拇指。

【讨论】:

    【解决方案3】:

    你可以这样做:

    public static (string Original, string Translation) Convert(string word)
    {
        return ("Hello", "Hello translated");
    }
    static void Main(string[] args)
    {
        List<string> words = new List<string>();
        words.Add("Hello");
    
        var result = from word in words
                        select Convert(word).Translation;
    
        Console.WriteLine("Hello, world!" + result.FirstOrDefault());
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2013-05-10
      • 2016-10-03
      • 1970-01-01
      • 2015-11-29
      相关资源
      最近更新 更多