在C#中,我想在字符串中搜索任何单词列表,然后返回找到的单词。我知道我可以循环,但我很好奇,如果有一个更简单的方法。
基本上有3个值被允许'但有时读取的值将具有该值加上无关的后缀。
例如
string[] permittedValues = {"Historical Search","Correspondence","Archived"};
但正在检查的数据可能是:
"Historical Search" (should return "Historical Search")
"Correspondence Vol 2" (should return "Correspondence")
"Archived - fileroom 3" (should return "Archived")
"sldfjslkdfjsdklfj" (should return something allowing it to be handled)
我能做到
bool isValidValue = permittedValues.Any(myString.Contains);
看看是否有任何列表出现,但我也需要得到哪一个。
希望这是有道理的。
(原本我错误地把#34;历史搜索" as"历史"所以我标记了Eser的答案是正确的,因为它对我原来的问题是准确的。
答案 0 :(得分:3)
如果它总是不同的后缀,这样的东西对你有用。基本上,它说:找到与我的输入具有相同起始字符的第一个permittedValue
,或者如果找不到任何内容则返回null
。
string[] permittedValues = {"Historical","Correspondence","Archived"};
string input = "Historical Vol2";
string val = permittedValues.FirstOrDefault(v => input.StartsWith(v)); // this will be null if there's no match.
if (val == null) {
Console.WriteLine("not permitted");
}
else {
Console.WriteLine(val); // prints "Historical"
}
答案 1 :(得分:2)
string[] permittedValues = { "Historical", "Correspondence", "Archived" };
string text = "Correspondence Vol 2";
var found = text.Split().FirstOrDefault(x => permittedValues.Contains(x));
答案 2 :(得分:0)
Intersect
是实现例程的另一种方式:
string[] permittedValues = { "Historical", "Correspondence", "Archived" };
string text = "Correspondence Vol 2";
var found = text
.Split(' ')
.Intersect(permittedValues)
.FirstOrDefault();
答案 3 :(得分:0)
这将返回通信。
using System.linq;
...
var haystack = "Correspondence Vol. 2";
var needles = new List<string>(){"Historical","Correspondence","Archived"};
var result = needles.Where(n => haystack.IndexOf(n) >= 0).First();