gpt4 book ai didi

c# - 从内联 Linq 转换为 Linq 查询?

转载 作者:太空宇宙 更新时间:2023-11-03 19:40:28 25 4
gpt4 key购买 nike

我编写了一个非常基本的 Linq 语句来获取数组中具有重复字母的所有字符串。这方面的代码很简单,但我可以看到对于团队中一些经验不足的开发人员(或那些不太熟悉 Linq 的开发人员)来说很难维护。

string[] results = values.Where(v => v.Where(w => v.Count(c => c == w) > 1).Any()).ToArray();
Console.WriteLine($"There are {results.Length} items with duplicate letters: {string.Join(", ", results)}");

我总是可以将它分解成一个嵌套的 foreach 循环,或者用其他几种方式编写:

    List<string> results = new List<string>();
foreach (string v in values) {
List<char> chars = new List<char>();
foreach (char c in v.ToUpperInvariant()) {
if (chars.Contains(c)) {
results.Add(v);
break;
}

chars.Add(c);
}
}

Console.WriteLine($"There are {results.Count} items with duplicate letters: {string.Join(", ", results.ToArray())}");

但是,我一直想了解有关实际 Linq 查询的更多信息,因为它们看起来比内联 Linq 更具可读性。我更喜欢像我一直在 Linq 查询中看到的那样命名我的变量:

List<string> myStrings = from val in values ...

我相信这会更易于维护,同时仍然像大多数 Linq 代码一样简洁,但我无法理解查询,因为它是按原样嵌套的。我一直试图把它写成:

string[] results = from val in values
where from currentCharacter in val
where ...

但我相信它可能更像是:

string[] results = from val in values
join currentCharacter in val on ...

老实说,我认为这两种方法都不是实现这一目标的正确方法,但这就是我来这里的原因。


如何将嵌套的 Linq 语句从内联语句转换为查询语句?

最佳答案

可以转换流畅的语法代码:

values.Where(v => v.Where(w => v.Count(c => c == w) > 1).Any()).ToArray();

通过查询语法+流畅的语法:

var result = (from val in values
where val.Any(w => val.Count(c => c == w) > 1)
select val).ToArray();

如您所见,这仍然涉及方法调用,这仅仅是因为某些查询必须表示为方法调用,因为Any 没有查询表达式语法>计数(据我所知)。

基本上不管怎样,您最终都需要在管道中的某处进行方法调用。


您可能想要做的另一件事是将 where 逻辑提取到某个方法中,例如

bool HasDuplicateCharacters(string input) => input.Any(w => input.Count(c => c == w) > 1);

那么查询将变为:

 var result = (from val in values
where HasDuplicateCharacters(val)
select val).ToArray();

与上面“完全”流畅的语法相比,现在阅读本文的任何人都应该知道代码在做什么。

关于c# - 从内联 Linq 转换为 Linq 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com