C# 如何基于第一个列表匹配检索子字符串

C# 如何基于第一个列表匹配检索子字符串,c#,linq,lambda,C#,Linq,Lambda,在字符串中,我需要根据列表中任何项的第一个匹配恢复一个7字符的子字符串。如果未进行匹配,则应返回空字符串 我有以下代码: List<string> myList = new List<string>() { "TNCO", "TNCB", "TNIT" }; string sample = "TNSD102, WHRK301, TNIT301, YTRE234"; //doesn't give an index bool anyfound = m

在字符串中,我需要根据列表中任何项的第一个匹配恢复一个7字符的子字符串。如果未进行匹配,则应返回空字符串

我有以下代码:

List<string> myList = new List<string>()
{
    "TNCO",
    "TNCB",
    "TNIT"
};
string sample = "TNSD102, WHRK301, TNIT301, YTRE234";

//doesn't give an index
bool anyfound = myList.Any(w => sample.Contains(w));

//code that needs replacing
string code = sample.Substring(sample.IndexOf("TNC"), 7);
if (code == "")
{
    code = sample.Substring(sample.IndexOf("TNIT"), 7);
}
List myList=new List()
{
“TNCO”,
“TNCB”,
“特尼特”
};
string sample=“TNSD102、WHRK301、TNIT301、YTRE234”;
//没有给出索引
bool anyfind=myList.Any(w=>sample.Contains(w));
//需要替换的代码
字符串代码=sample.Substring(sample.IndexOf(“TNC”),7);
如果(代码==“”)
{
代码=sample.Substring(sample.IndexOf(“TNIT”),7);
}
列表中的项目不可能超过35-40个,且字符串小于50个字符


有人能给我指出正确的方向吗?

数据集如此之小,您只需拆分字符串并搜索第一个匹配项:

// split the sample string into separate entries
var entries = sample.Split(new char[] {',', ' '},
    StringSplitOptions.RemoveEmptyEntries);

// find the first entry starting with any allowed prefix
var firstMatch = entries.FirstOrDefault (
    e => myList.Any (l => e.StartsWith(l)));

// FirstOrDefault returns null if there are no matches
if (firstMatch == null)
    Console.WriteLine("No match!");
else
    Console.WriteLine(firstMatch);
示例输出():


这将为您提供所有匹配项的IEnumerable:

var matches = from code in sample.Split(',')
              from w in myList
              where code.Trim().StartsWith(w)
              select code;
要获取第一个值,请使用FirstOrDefault。然后,如果不存在匹配项,则使用合并运算符
返回空字符串

string firstMatch = (matches.FirstOrDefault() ?? "").Trim();

在此运行此代码将根据您试图查找的内容返回索引2

int keyIndex = myList.FindIndex(w => samples.Contains(w));
TNIT301
这是索引字符串值

您还可以执行以下操作来返回
keyIndex
变量值的索引位置的字符串值

var subStrValue = samples.Split(',')[keyIndex];
List myList=新列表{“TNCO”、“TNCB”、“TNIT”};
string sample=“TNSD102、WHRK301、TNIT301、YTRE234”;
string[]sampleItems=sample.Split(新的[]{','','},StringSplitOptions.RemoveEmptyEntries);
var results=myList
.选择(前缀=>sampleItems
.FirstOrDefault(item=>item.StartsWith(前缀))??“”;

我不明白。列表中的字符串是否为
示例中包含的逗号分隔项的开头?你只是想找到子串?比如…在myList[2]上执行这个程序会给你“TNIT301”?你能说明你的函数的输入是什么吗?如果给定一个特定的输入,预期的输出是什么。
int-keyIndex=myList.FindIndex(w=>samples.Contains(w))此返回索引2这是您想要的吗。。?我添加了代码并对其进行了测试,以提供适当的结果。检查并测试答案这对我来说是最容易理解的,不过我想你需要一个代码。FirstOrDefault()因为他要求第一次匹配。太棒了,正是我需要的。感谢Tomas。调用
ToList
真的有必要吗?
ToList()
不需要,因为从
Split
返回的
字符串[]
已经是
IEnumerable
了。回答得很好。是的,不是,我的错,我以前用过ForEach,但忘了把它取下来。回答editedAlso,
FirstOrDefault
在“默认”情况下返回
null
,而不是空字符串。您的第一行给出了myList中的索引。但是,第二行在示例字符串中使用此索引。这给出了一个错误的结果。尝试使用
string sample=“TNSD102,TNIT301,WHRK301,YTRE234”
,它将返回
WHRK301
var subStrValue = samples.Split(',')[keyIndex];
string val1 = (sample.Split(',').FirstOrDefault(w => myList.Any(m => w.Contains(m))) ?? string.Empty).Trim();
List<string> myList = new List<string> { "TNCO", "TNCB", "TNIT" };
string sample = "TNSD102, WHRK301, TNIT301, YTRE234";
string[] sampleItems = sample.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);

var results = myList
    .Select(prefix => sampleItems
        .FirstOrDefault(item => item.StartsWith(prefix)) ?? "");