如何在LINQ的列表中找到最近的字符串
本文关键字:最近 字符串 列表 LINQ | 更新日期: 2023-09-27 18:01:18
如果我想找到精确匹配或下一个最接近的字符串。使用SQL,我可以做:
SELECT TOP 1 *
FROM table
WHERE Code >= @searchcode
ORDER BY Code
我如何使用LINQ和记录列表来实现这一点?
我希望能够做这样的事情:
var find = ListDS.Where(c => c.Code >= searchcode).First();
但是你不能那样比较字符串
注意Code
是一个alpha字符串,字母、数字、符号等等。
最近的意思是,如果你有一个包含"英格兰","法国","西班牙"的列表,你搜索"法国",然后你得到"法国"。如果你搜索"德国",你会得到"西班牙"。
下面这段简单的代码可能会对你有所帮助
List<string> ls = new List<string>();
ls.Add("ddd");
ls.Add("adb");
var vv = from p in ls where p.StartsWith("a") select p;
选择所有以"a"开头的元素
如果Code
是int
,则可能有效:
var find = ListDS.Where(c => c.Code >= searchcode).OrderBy(c => c.Code).First();
,否则您需要将其转换为一个:
int code = int.Parse(searchcode);
var find = ListDS.Where(c => Convert.ToInt32(c.Code) >= code).OrderBy(c => Convert.ToInt32(c.Code)).First();
试试这个解决方案:
class Something
{
public string Code;
public Something(string code)
{
this.Code = code;
}
}
class Program
{
static void Main(string[] args)
{
List<Something> ListDS = new List<Something>();
ListDS.Add(new Something("test1"));
ListDS.Add(new Something("searchword1"));
ListDS.Add(new Something("test2"));
ListDS.Add(new Something("searchword2"));
string searchcode = "searchword";
var find = ListDS.First(x => x.Code.Contains(searchcode));
Console.WriteLine(find.Code);
Console.ReadKey();
}
}
我用.Contains
代替了你的>=
。您也可以在First
中添加动作,而不需要Where
。
它不会找到"最近的",只会找到包含搜索参数的第一个单词。
你可以在c#中比较字符串,它将按字母顺序使用:
var find = ListDS.Where(c => c.Code.CompareTo(searchcode) >= 0)
.OrderBy(c => c) // get closer one, need to order
.First();
参考CompareTo文档
注意,对于这个方法,"10" > "2"
.