确定字符串中是否出现任何值列表,并返回哪一个值

时间:2017-09-06 20:54:22

标签: c#

在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的答案是正确的,因为它对我原来的问题是准确的。

4 个答案:

答案 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();