C# 正在字符串列表中查找下一个匹配项(整数)

C# 正在字符串列表中查找下一个匹配项(整数),c#,string,list,search,numbers,C#,String,List,Search,Numbers,我在字符串列表中查找下一个整数匹配时遇到问题,需要考虑其他一些方面: 单个字符串包含不相关的尾随字符和前导字符 数字格式为“D6”示例000042 数字上有差距 列表没有排序,但如果有一种快速方法可以忽略前导字符,则可能会排序 例如: abc-000001.0文件 aaac-000002.0文件 ab-002010.0文件 abbc-00003.0文件 abbbc-00004.0文件 abcd-00008.0文件 abc-000010.0文件 x-902010.0文件 用户输入为7=>下

我在字符串列表中查找下一个整数匹配时遇到问题,需要考虑其他一些方面:

  • 单个字符串包含不相关的尾随字符和前导字符
  • 数字格式为“D6”示例000042
  • 数字上有差距
  • 列表没有排序,但如果有一种快速方法可以忽略前导字符,则可能会排序
例如:

  • abc-000001.0文件
  • aaac-000002.0文件
  • ab-002010.0文件
  • abbc-00003.0文件
  • abbbc-00004.0文件
  • abcd-00008.0文件
  • abc-000010.0文件
  • x-902010.0文件
用户输入为7=>下一个匹配字符串为abcd-000008.file

我的尝试是:

int userInput = 0;
int counter = 0;
string found = String.Empty;
bool run = true;

while (run)
{
    for (int i = 0; i < strList.Count; i++)
    {
        if(strList[i].Contains((userInput + counter).ToString("D6")))
        {
            found = strList[i];
            run = false;
            break;
        }
    }
    counter++;
}
int userInput=0;
int计数器=0;
找到的字符串=string.Empty;
bool run=true;
while(运行)
{
for(int i=0;i

这是不好的,因为它很慢,并且可以变成一个无限循环。但是我真的不知道该怎么做(fast)。

您可以使用解析字符串中的数字,并创建一个排序的集合,您可以使用
Where
子句进行搜索:

var strings = new[] { "abc-000001.file", "x-000004.file"};
var regP = "\\d{6}"; // simplest option in my example, maybe something more complicated will be needed
var reg = new Regex(regP);
var collection = strings
    .Select(s =>
    {
        var num = reg.Match(s).Captures.First().Value;
        return new { num = int.Parse(num), str = s};
    })
    .OrderBy(arg => arg.num)
    .ToList();

var userInput = 2;
var res = collection
    .Where(arg => arg.num >= userInput)
    .FirstOrDefault()?.str; // x-000004.file
附言


应如何处理
9002010
0000010
0002010
?因为他们有7个字符。它是
[9002010,102010]
还是
[900201,1201]

您可以使用字符串解析数字,并创建一个排序的集合,您可以使用
Where
子句进行搜索:

var strings = new[] { "abc-000001.file", "x-000004.file"};
var regP = "\\d{6}"; // simplest option in my example, maybe something more complicated will be needed
var reg = new Regex(regP);
var collection = strings
    .Select(s =>
    {
        var num = reg.Match(s).Captures.First().Value;
        return new { num = int.Parse(num), str = s};
    })
    .OrderBy(arg => arg.num)
    .ToList();

var userInput = 2;
var res = collection
    .Where(arg => arg.num >= userInput)
    .FirstOrDefault()?.str; // x-000004.file
附言


应如何处理
9002010
0000010
0002010
?因为他们有7个字符。它是
[9002010,102010]
还是
[900201,1201]

如果您不想要正则表达式,可以这样做:

List<string> strings = new List<string>
{
    "abc-000001.file",
    "aaac-000002.file",
    "ab-0002010.file",
    "abbc-000003.file",
    "abbbc-000004.file",
    "abcd-000008.file"
};
int input = 7;

var converted = strings.Select(s => new { value = Int32.Parse(s.Split('-', '.')[1]), str = s })
                        .OrderBy(c => c.value);

string result = converted.FirstOrDefault(v => v.value >= input)?.str;

Console.WriteLine(result);
List strings=新列表
{
“abc-000001.file”,
“aaac-000002.file”,
“ab-0002010.file”,
“abbc-000003.file”,
“abbbc-000004.file”,
“abcd-000008.文件”
};
int输入=7;
var converted=strings.Select(s=>new{value=Int32.Parse(s.Split('-','.')[1]),str=s})
.OrderBy(c=>c.value);
字符串结果=已转换的.FirstOrDefault(v=>v.value>=input)?.str;
控制台写入线(结果);

如果您不想要正则表达式,可以这样做:

List<string> strings = new List<string>
{
    "abc-000001.file",
    "aaac-000002.file",
    "ab-0002010.file",
    "abbc-000003.file",
    "abbbc-000004.file",
    "abcd-000008.file"
};
int input = 7;

var converted = strings.Select(s => new { value = Int32.Parse(s.Split('-', '.')[1]), str = s })
                        .OrderBy(c => c.value);

string result = converted.FirstOrDefault(v => v.value >= input)?.str;

Console.WriteLine(result);
List strings=新列表
{
“abc-000001.file”,
“aaac-000002.file”,
“ab-0002010.file”,
“abbc-000003.file”,
“abbbc-000004.file”,
“abcd-000008.文件”
};
int输入=7;
var converted=strings.Select(s=>new{value=Int32.Parse(s.Split('-','.')[1]),str=s})
.OrderBy(c=>c.value);
字符串结果=已转换的.FirstOrDefault(v=>v.value>=input)?.str;
控制台写入线(结果);

我想我在最初的问题中没有说得足够清楚,前导字符和尾随字符可以是任何字符(这不会破坏数字的D6格式)。很抱歉,我想我在最初的问题中没有说清楚,前导字符和尾随字符可以是任何字符(这不会破坏数字的D6格式)。抱歉,我的错,我在创建示例时犯了一个错误,应该是6个字符,请更正。你的答案看起来很有希望,我会试试看。感谢you@nanu_nana很高兴这有帮助。您可以将代码中的
var regP=“\\d{6,}”
更改为
var regP=“\\d{6}”
(答案中也已修复)。我的错,我创建示例时出错,应该是6个字符,请更正。你的答案看起来很有希望,我会试试看。感谢you@nanu_nana很高兴这有帮助。您可以将代码中的
var regP=“\\d{6,}”
更改为
var regP=“\\d{6}”
(答案中也已修复)。