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

C# 确定值列表中是否有任何值出现在字符串中,并返回哪个值,c#,C#,在C语言中,我想在字符串中搜索任何一个单词列表,并返回找到的单词。我知道我可以循环,但我很好奇是否有更简单的方法 基本上有3个值是“允许的”,但有时被读取的值会有该值加上额外的后缀 乙二醇 但被检查的数据可能是: "Historical Search" (should return "Historical Search") "Correspondence Vol 2" (should return "Correspondence") "Archived - filer

在C语言中,我想在字符串中搜索任何一个单词列表,并返回找到的单词。我知道我可以循环,但我很好奇是否有更简单的方法

基本上有3个值是“允许的”,但有时被读取的值会有该值加上额外的后缀

乙二醇

但被检查的数据可能是:

"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);  
要查看列表中是否有任何一个出现,但我还需要获取其中一个

希望这是有道理的


最初我错误地将历史搜索设置为历史搜索,因此我将Eser的答案标记为正确,因为它对于我的原始问题是准确的。

如果后缀总是不同的,那么类似的东西对您来说是可行的。本质上,它说:找到第一个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" 
    }

如果后缀总是不同的,那么类似这样的东西对你来说很有用。本质上,它说:找到第一个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" 
    }
Intersect是实现例程的另一种方法:

string[] permittedValues = { "Historical", "Correspondence", "Archived" };
string text = "Correspondence Vol 2";

var found = text
  .Split(' ')
  .Intersect(permittedValues)
  .FirstOrDefault();
Intersect是实现例程的另一种方法:

string[] permittedValues = { "Historical", "Correspondence", "Archived" };
string text = "Correspondence Vol 2";

var found = text
  .Split(' ')
  .Intersect(permittedValues)
  .FirstOrDefault();

这将返回通信

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

这将返回通信

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


如果您的值包含所有三个允许的值怎么办?无论如何:你写了关于循环你的项目?这对你有用吗?如果没有,您会得到什么错误/结果?显示您已经尝试过的一切就绪。if myString.ContainsHistorical{..do something}有什么问题?if myString.containsRespondence{..something}?@himbrombee是一个好问题,在这种特殊情况下不会,因为字符串是通过连接值以编程方式创建的。@Equalsk没有任何错误,我只是好奇C语言中是否已经有一些东西可以在一行中完成我要查找的所有内容。我修改了这个问题,因为我不小心将其中一个值写为历史值,而实际上它是历史值。如果您的值包含所有三个允许的值怎么办?无论如何:你写了关于循环你的项目?这对你有用吗?如果没有,您会得到什么错误/结果?显示您已经尝试过的一切就绪。if myString.ContainsHistorical{..do something}有什么问题?if myString.containsRespondence{..something}?@himbrombee是一个好问题,在这种特殊情况下不会,因为字符串是通过连接值以编程方式创建的。@Equalsk没有任何错误,我只是好奇C中是否已经有一些东西可以在一行中完成我所寻找的所有内容。我修改了这个问题,因为我不小心将其中一个值写为历史值,而实际上它是历史搜索。是的,总是后缀不同。我想Contains会比StartsWith更好,因为如果允许值位于字符串的中间。不过,这在老年退休金计划中并不重要,只是一个提示。不管怎样,答案是好的和正确的。同意,但是StartWith对于OP的情况会更有效。那么这个答案和Eser发布的答案之间的区别是不是这个答案是针对不同的后缀而不是在字符串中的任何位置找到值?我只是在学习C@ChrisYYC你两个都试过了吗?它们会给你相同的结果吗?是的,它总是不同的后缀。我假设包含比StastSee更好,因为如果允许的值在字符串的中间,它也会工作。不过,这在老年退休金计划中并不重要,只是一个提示。不管怎样,答案是好的和正确的。同意,但是StartWith对于OP的情况会更有效。那么这个答案和Eser发布的答案之间的区别是不是这个答案是针对不同的后缀而不是在字符串中的任何位置找到值?我只是在学习C@ChrisYYC你两个都试过了吗?他们给了你同样的结果吗?@HimBromBeere,这就是问题所在:通信第二卷下次应该返回通信在否决任何东西之前仔细阅读问题。尽管我引入了一个错误,但瑟的回答对我原来的问题有效,因此,我将此标记为解决方案。@HimBromBeere,这就是问题所在:信函第二卷下次应返回信函在否决任何问题之前仔细阅读该问题。尽管我引入了一个错误,但辛格的回答对我的原始问题有效,因此,我将此标记为解决方案。这非常优雅。Re:我承认我在评论njenson的解决方案时犯的错误,如果历史的允许值实际上是历史搜索呢?由于值中有空格,您的解决方案将跳过这些值。可以用Intersect处理吗?@ChrisYYC Split将文本拆分为单词。所以这个问题和我的问题都是基于这个。但是你在比赛中改变了游戏规则,这很优雅。Re:我承认我在评论njenson的解决方案时犯了错误,什么 如果历史的允许值实际上是历史搜索?由于值中有空格,您的解决方案将跳过这些值。可以用Intersect处理吗?@ChrisYYC Split将文本拆分为单词。所以这个问题和我的问题都是基于这个。但你在比赛中改变了游戏规则。