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文件
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}”
(答案中也已修复)。