如何在c#中按版本降序排列?
我有一个列表,里面有一些版本 样本数据:如何在c#中按版本降序排列?,c#,.net,linq,C#,.net,Linq,我有一个列表,里面有一些版本 样本数据: "4.5","2.1","2.2.1","7.5","7.5.3","N/A","2.3.4.5" decimal result; var sortedVData = vData.OrderByDescending(v => decimal.TryParse(v.vCode, out result) ? Convert.ToDecimal(v.vCode) : decimal.MaxValue); 正如您所看到的数据,我试图通过降序对列表进行排
"4.5","2.1","2.2.1","7.5","7.5.3","N/A","2.3.4.5"
decimal result;
var sortedVData = vData.OrderByDescending(v => decimal.TryParse(v.vCode, out result) ? Convert.ToDecimal(v.vCode) : decimal.MaxValue);
正如您所看到的数据,我试图通过降序对列表进行排序。3.8.5
isinvalid
number&NA
是无效的
代码:
"4.5","2.1","2.2.1","7.5","7.5.3","N/A","2.3.4.5"
decimal result;
var sortedVData = vData.OrderByDescending(v => decimal.TryParse(v.vCode, out result) ? Convert.ToDecimal(v.vCode) : decimal.MaxValue);
输出:“NA”、“7.5.3”、“2.3.4.5”、“2.2.1”、“7.5”、“4.5”、“2.1”
正如您在我的else(:)
条件中所看到的,我正在执行decimal.MaxValue
以使NA
在存在无效值(任何带文本的字符串)时位于顶部,但是2.2.1
应该是一个例外,并且应该作为数字工作(2.2.1或任何具有多个小数的数字在版本中是无效的,我希望它们有条件地有效
预期结果:“NA”、“7.5.3”、“7.5”、“4.5”、“2.3.4.5”、“2.2.1”、“2.1”
您可以将此扩展方法用于LINQ查询:
public static Version TryGetVersion(this string item)
{
Version ver;
bool success = Version.TryParse(item, out ver);
if (success) return ver;
return null;
}
那么完整的查询很简单:
var sortedVData = vData
.Select(v => new { Obj = v, Version = v.vCode.TryGetVersion() })
.OrderBy(x => x.Version != null) // first all invalid versions
.ThenByDescending(x => x.Version) // then by version descending
.Select(x => x.Obj);
因此,实际上最好在类中存储字符串而不是字符串
这比使用局部变量要好。就像@WaiHaLee说的,你可以使用Version,它实现了IComparable,所以你可以这样做:
static void Main(string[] args)
{
var data = new[] {"4.5","2.1","2.2.1","7.5","7.5.3",@"N/A","2.3.4.5"};
foreach(var v in data.OrderByDescending(OrderVersion))
Console.WriteLine(v);
}
private static IComparable OrderVersion(string arg)
{
//Treat N/A as highest version
if (arg == "N/A")
return new Version(Int32.MaxValue,Int32.MaxValue);
return Version.Parse(arg);
}
公共类版本比较程序:IComparer
{
公共整数比较(字符串x、字符串y)
{
如果(x.ToLower()=@“不适用”)
{
如果(y.ToLower()=@“不适用”)
返回0;
返回-1;
}
如果(y.ToLower()=@“不适用”)
{
如果(x.ToLower()=@“不适用”)
返回0;
返回1;
}
var verX=Version.Parse(x);
var verY=Version.Parse(y);
返回verX.CompareTo(verY);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var版本=新[]{“4.5”、“2.1”、“2.2.1”、“7.5”、“7.5.3”、@“N/A”、“2.3.4.5”};
foreach(versions.OrderByDescending中的var v(v=>v,newversionComparer())
{
控制台写入线(v);
}
}
}
可能使用?你在找吗?在code Golf中发布此信息?;-)7.5.3的十进制数是多少?@wailae版本
我从来都不知道。让我试试看。对于“11.1.2”这将失败1.我没能看懂你的意思。ty@waiHaLee注释帮助我构建了我所需要的框架&您的答案绝对准确无误。v.vCode.TryGetVersion()
当我在列表中有NA
时将返回null,并且结束列表将有null而不是NA
ontop@supercool:没有,我使用了.OrderBy(x=>x.Version!=null)
将无效版本移到顶部。您还可以使用.OrderByDescending(x=>x.Version==null)
或.OrderBy(x=>x.Version==null?0:1)
。诀窍在于比较返回true
或false
,true
的值高于false
。这就是为什么.OrderBy(x=>x.Version!=null)
将有效版本移动到底部。您需要OrderBy
和然后按上面所示的降序
。嗯,是的,我得到了排序部分,这很聪明。当我尝试在真实代码中使用相同的逻辑时(我绑定到下拉列表,每个列表项都有许多实体,例如示例中未给出的版本等)似乎有一点问题。无论如何我会解决的。干杯,谢谢你的时间。泰