3

在一个字符串中,我需要根据列表中任何项目的第一个匹配项恢复一个 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);
}

该列表永远不可能超过 35-40 个项目并且字符串 < 50 个字符。

谁能指出我正确的方向?

4

5 回答 5

2
string val1 = (sample.Split(',').FirstOrDefault(w => myList.Any(m => w.Contains(m))) ?? string.Empty).Trim();
于 2013-02-27T22:58:54.427 回答
1

这为您提供了所有匹配项的 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();
于 2013-02-27T22:55:42.477 回答
0

有了这么小的数据集,您可以简单地拆分字符串并搜索第一个匹配项:

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

示例输出(DEMO):

TNIT301
于 2013-02-27T22:49:11.263 回答
0

在此处运行此代码会根据您要查找的内容返回索引 2。

int keyIndex = myList.FindIndex(w => samples.Contains(w));

TNIT301这是索引字符串值

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

var subStrValue = samples.Split(',')[keyIndex];
于 2013-02-27T22:56:42.887 回答
0
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)) ?? "");
于 2013-02-27T22:59:15.910 回答