如果我有以下代码:
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。
答案 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;