【问题标题】:Get string that matched with Any in LINQ获取与 LINQ 中的 Any 匹配的字符串
【发布时间】:2018-05-01 19:45:03
【问题描述】:

我需要测试一个字符串,看看它是否以任何字符串数组结尾。

我通过关注this answer 找到了使用 LINQ 的完美解决方案:

string test = "foo+";
string[] operators = { "+", "-", "*", "/" };
bool result = operators.Any(x => test.EndsWith(x));

现在我想获取匹配的字符串,这就是我目前遇到的问题。


我尝试在末尾添加

text_field.Text = x;

并且错误地显示了有关范围的消息 - 理所当然地,我期待这个错误。我还尝试在最顶部声明​​一个名为x 的字符串变量,结果出现了另一个错误——无法在不同的范围内重新声明变量。我想我已经习惯了 PHP,你可以毫无问题地重新声明一个变量。

【问题讨论】:

  • Any() 返回一个布尔值,如果你真的想要一些东西,可以试试FirstOrDefault()。请记住,尽管您可以匹配多个项目,但您打算如何处理其余项目?你关心?是否应该任意返回第一个匹配项?
  • 您是否要在整个字符串的末尾加上 +?
  • @SimonPrice 是的,但前提是它与 operators 数组之一匹配。
  • 正则表达式是正确的答案,但我的也是。归结为您的偏好
  • @maccettura 在我的情况下,我只希望得到 1 项匹配或根本没有匹配项。不应该有任何情况下它会匹配 2 个或更多 operators

标签: c# arrays linq ends-with


【解决方案1】:

我会为此使用正则表达式

string test = "foo+";
var match = Regex.Match(test, @".+([\+\-\*\\])$").Groups[1].Value;
如果字符串不以 +-*/ 结尾,

match 将为 ""

【讨论】:

  • 为什么要为这么简单的事情引入正则表达式?
  • @gilliduck 我错过了什么规则?
  • @gilliduck Regex is way too involved 也许只适合你?
  • @gilliduck 所以我们必须回答 OP 的要求并且不发布其他可能有效的替代方案?如果,例如,post 是一个 XY 问题(我不是指这种情况)怎么办?
  • 我可以使用正则表达式。我只是不知道如何编写它们,所以在这种情况下,我会更喜欢 LINQ 答案。万一有人没有注意到我在链接到的答案中使用了完全相同的代码。使用我应该测试的实际字符串修改正则表达式对我来说有点工作。无论如何 - 赞成,因为它似乎工作regex101.com/r/5aT2eH/1
【解决方案2】:

你最好的办法是做一个FirstOrDefault 然后检查它是否为空/空/等,就好像它是你的布尔值一样。尽管这是一个非常基本的示例,但它应该能够理解这一点。您如何处理该结果以及是否应该只是一个或多个等取决于您的情况。

    static void Main()
    {
        string test = "foo+";
        string[] operators = { "+", "-", "*", "/" };
        bool result = operators.Any(x => test.EndsWith(x));

        string actualResult = operators.FirstOrDefault(x => test.EndsWith(x));

        if (result)
        {
            Console.WriteLine("Yay!");
        }

        if (!string.IsNullOrWhiteSpace(actualResult))
        {
            Console.WriteLine("Also Yay!");
        }
    }

【讨论】:

  • 我没有投反对票,但这不应该是operators.Where(x => test.EndsWith(x)).FirstOrDefault()吗?
  • @uom-pgregorio,不,在这种情况下它们是等价的。
  • @maccettura 你确定,因为我现在正在 Visual Studio 中查看它,它似乎工作得很好。
  • @gilliduck 误读,认为结果是string,在这种情况下if(result) 将无法编译。我的错!
【解决方案3】:

如果我理解正确,这将为您提供操作员

string test = "foo+";
string[] operators = { "+", "-", "*", "/" };
var result = operators.Where(x => test.EndsWith(x)) ;

这将只返回最后使用的运算符,因此如果它以 -+* 结尾,它将为您提供字符串中的最后一个字符

【讨论】:

  • 如果您能解释一下标记,我将不胜感激,这是一个正确的答案并获得了 OP 之后的值
  • 除了他们自己惊人的正则表达式解决方案之外,可能只是 Eser 对所有答案都持否定态度。天堂禁止你在问题的范围内回答。
  • 这不是一个正确的答案。 result 不会是匹配的单个运算符
  • 如果 OP 知道他们的 .Any() 可能有一个或多个可能的命中并想知道其中的任何一个或全部,这是一个可行的答案。我的回答只是给出了第一个匹配的。
  • 感谢您澄清这会返回多个命中。就我而言,只有 1 个或 0 个命中,因为字符串只能以 1 个字符结尾。虽然赞成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
相关资源
最近更新 更多