如何在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
is
invalid
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
然后按上面所示的降序
。嗯,是的,我得到了排序部分,这很聪明。当我尝试在真实代码中使用相同的逻辑时(我绑定到下拉列表,每个列表项都有许多实体,例如示例中未给出的版本等)似乎有一点问题。无论如何我会解决的。干杯,谢谢你的时间。泰