如何使用c#和LINQ从字符串集合中获取最大值? 例如:
List<String> lst = new List<String> { "1.0.0", "1.0.2", "1.0.15", "1.1.0" };
示例1: - 比较1.0.0和1.1.0,最大版本是1.1.0 例2: - 比较1.0.2和1.0.15,最大版本是1.0.15 示例3: - 比较1.0.0和1.0.2,最大版本是1.0.2。
答案 0 :(得分:5)
考虑使用.Net Version
class
您可以从字符串创建它,它已经以您可能需要的方式处理比较
Version v1 = new Version("1.2.3.4");
Version v2 = new Version("1.3.0");
Console.WriteLine(v2>v1);
在你的情况下,使用Linq,你可以拥有
List<String> lst = new List<String> { "1.0.0", "1.0.2", "1.0.15", "1.1.0" };
Version maxVersion = lst.Select(s=> new Version(s)).Max();
Console.WriteLine(maxVersion);
答案 1 :(得分:2)
在您给出的示例中,您可以将它们排序为字符串。但我强烈建议你不要这样做 - 否则“11.0.0”会被视为早于“2.0.0”。
相反,我建议创建一个带有major / minor / patch值的Version
类。这可以以明显的方式实现IComparable<Version>
。解析所有字符串以创建List<Version>
,然后您可以在列表中找到最大值(或对整个列表进行排序)。如果你愿意,你甚至可以使用System.Version
类,虽然它看起来只需要三个部分就支持四个部分。如果你不介意它支持的部分比你需要的多,那肯定比编写自己的部分简单。
List<String> list = new List<String> { "1.0.0", "1.0.2", "1.1.0" };
List<Version> versions = list.Select(x => Version.Parse(x)).ToList();
Version maxVersion = versions.Max();
如果您不需要任何其他版本,则甚至不需要第二个列表 - 只需将投影传递到Max
:
List<String> list = new List<String> { "1.0.0", "1.0.2", "1.1.0" };
Version maxVersion = list.Max(x => Version.Parse(x));
将值解析为Version
个对象会使它们 更容易使用,而不是将它们作为字符串。例如,您可以按主要版本号,甚至“超过1.0.5的任何内容”或任何您想要的内容进行过滤。通常,最好将字符串解析为尽可能早地表示您正在使用的数据的类型,并且只能尽可能晚地再次格式化以进行显示。这适用于字符串,数字,所有内容。
答案 2 :(得分:1)
List<string> lst = new List<string> { "1.0.0", "1.0.2", "1.0.15", "1.1.0" };
var value = lst.Max(x => new Version(x));
Result=1.1.0
答案 3 :(得分:-2)
String test = ""1.0.0", "1.0.2", "1.1.0"";
String[] testArray = test.split(", ");
int max = Integer.MIN_VALUE, maxIndex = 0;
for (int i = 0; i < testArray.length; i++) {
if (Integer.parseInt(testArray[i]) > max) {
max = Integer.parseInt(testArray[i]);
maxIndex = i;
}
}
希望这能帮到你。