C#如何查找List<string>中小于指定字符串的最大元素索引
问题原因
编译报错和逻辑不匹配的核心原因有两点:
- C#的
string类型未重载<、>这类数值比较运算符,无法直接通过运算符判断两个字符串的大小关系 - 数字格式的字符串默认按字典序(字符编码顺序)排序,和数值大小的排序规则完全不同,直接做字符串比较会出现
"9" > "10"、"100" < "2"这类不符合数值逻辑的结果
解决方案
根据实际业务需求选择对应实现即可:
场景1:字符串存储内容为数字,需按数值大小比较(与int列表逻辑一致)
这是示例对应的业务场景,将字符串解析为数值类型后再做比较即可,示例代码:
string givenString = "10"; List<string> myListOfStrings = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" }; // 目标值转数值,若列表可能存在非数字内容,建议用int.TryParse做容错处理 int targetValue = int.Parse(givenString); // 筛选数值小于目标值的元素,取数值最大的项 string maxMatchItem = myListOfStrings .Where(s => int.Parse(s) < targetValue) .MaxBy(s => int.Parse(s)); int index = myListOfStrings.IndexOf(maxMatchItem); // 返回结果8,与int版本逻辑一致 string result = myListOfStrings[index]; // 返回结果"9"
如果使用.NET 5及更早版本,没有内置MaxBy方法,可以替换为倒序取首项的写法实现相同效果:
string maxMatchItem = myListOfStrings .Where(s => int.Parse(s) < targetValue) .OrderByDescending(s => int.Parse(s)) .First();
场景2:需按字符串字典序(字符编码顺序)比较
如果业务不需要按数值逻辑判断,仅需要按字符串本身的排序规则找小于目标值的最大项,使用string.CompareOrdinal做大小判断即可,示例代码:
string givenString = "10"; List<string> myListOfStrings = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" }; string maxMatchItem = myListOfStrings .Where(s => string.CompareOrdinal(s, givenString) < 0) .Max(StringComparer.Ordinal); int index = myListOfStrings.IndexOf(maxMatchItem);
重要提示:字典序比较下,首字符
'9'的ASCII码大于'1',因此"9" > "10",上述代码返回的结果为"8"、对应索引7,和数值比较的结果存在差异,使用前请确认业务规则。
内容的提问来源于stack exchange,提问作者user2102327
相关产品推荐
相关产品推荐

