【问题标题】:Returning If-Else Result Independent of If-Else Order?返回独立于 If-Else 顺序的 If-Else 结果?
【发布时间】:2018-05-30 13:45:34
【问题描述】:

如果我有以下代码:

string x = "123";
string y = "abc";

if (stringVar.Contains(x))
{
    return x;
}
else if (stringVar.Contains(y))
{
    return y;
}

在哪里

string stringVar = "123abc";

会的

return x;

然而

stringVar = "abc123";

也会

return x;

有没有一种方法可以让返回结果基于 stringVar 的顺序而不是遵循 if-else 语句的预定义顺序?

我想要的结果是:

stringVar = "123abc";
...
return x;

如果:

stringVar = "abc123";
...
return y;

编辑:

这个例子是我当前问题的一个非常简化的例子,String.StartsWith() 并不总是有效,因为我正在寻找的文本并不总是在 stringVar 的开头。此外,在我的实际问题中,单词之间没有明显的分隔符(即没有空格),也使得拆分 stringVar 变得困难。

【问题讨论】:

  • stringVar.StartsWith()?
  • 查看string 类上的StartsWith 方法,这可能会对您有所帮助。它至少会告诉您变量中的第一个子字符串。

标签: c# if-statement


【解决方案1】:

首先我建议将项目存储在一个集合中,例如:

string[] words = {"123","abc"};

现在您可以使用string.IndexOf 和 LINQ:

return words
    .Where(stringVar.Contains)
    .OrderBy(stringVar.IndexOf)
    .FirstOrDefault();

【讨论】:

  • 是的,这比我的要好。
  • 为什么不直接使用 StartsWith?
  • 他使用Contains是因为我认为他不知道StartsWith
  • @TimSchmelter 感谢您的回答,这非常有效!
  • @CodeNotFound:不。 "String.StartsWith() 并不总是有效,因为我要查找的文本并不总是在 stringVar" 的开头:)
【解决方案2】:

试试string.IndexOf()。它返回其他子字符串的第一个索引,-1

那么你可以根据哪个数字较小返回。

"abc123".indexOf("abc") = 0
"abc123".indexOf("123") = 3

【讨论】:

    【解决方案3】:

    将搜索字符串放入数组中,计算IndexOf,然后选择最早的匹配项:

    var searchStrings = new[] {"abc", "123"};
    var res = searchStrings.Select(s => new { // Pair up a string with its index in stringVar
        Value = s
    ,   Index = stringVar.IndexOf(s)
    })
    .Where(p => p.Index >= 0)                 // Remove strings that did not produce a match
    .OrderBy(p => p.Index)                    // Order by the match position
    .FirstOrDefault(p => p.Value);            // Pick the earliest one
    

    【讨论】:

    • 应该注意这比蒂姆的答案更有效,因为它只搜索每个子字符串一次。
    • @juharr 没错。但是,在大多数实际情况下,这不会产生可测量的差异,因为 Tim 的代码只对第一次通过成功的字符串进行第二次传递。
    【解决方案4】:

    这是一种非 Linq 方法。

    var subStrings = new[] {"abc", "123"};
    string result = null;
    int position = stringVar.Length;
    foreach(var sub in subStrings)
    {
        var currPos = stringVar.IndexOf(sub);
        if(currPos > -1 && currPos < position)
        {
            position = currPos;
            result = sub;
        }
    }
    
    return result;
    

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2012-05-11
      • 2022-07-12
      • 1970-01-01
      • 2016-07-23
      • 2022-08-18
      相关资源
      最近更新 更多