返回If-Else结果独立于If-Else Order?

时间:2018-05-30 13:45:35

标签: c# if-statement

如果我有以下代码:

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;

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

我想要的结果是:

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

以及如果:

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

编辑:

此示例是我当前问题的一个非常简化的示例,String.StartsWith()并不总是有效,因为我要查找的文本并不总是在stringVar的开头。另外,在我的实际问题中,单词之间没有明显的分隔符(即没有空格)要么难以分割stringVar。

4 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:1)

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

然后您可以根据哪个数字较低来返回。

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

答案 2 :(得分:1)

将搜索字符串放入数组中,计算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

答案 3 :(得分:0)

这是一种非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;