轻松排序对象列表

时间:2017-07-20 09:54:22

标签: c# linq

我有需要按“IST”字段排序的对象列表。 字段“IST”始终包含数值但不知何故开发人员将其设计为字符串类型。

示例:

  • Dsrm.IST =“5”;
  • Dsrm.IST =“10”;
  • Dsrm.IST =“2”;
  • Dsrm.IST =“3”;
  • Dsrm.IST =“1”;
  • Dsrm.IST =“22”;

当我使用

var temp = Dsrm.OrderBy(x => x.IST); 

排序不正确。 有没有一个简单的解决方案来解决这个问题。

不,我不允许更改表格的定义。

2 个答案:

答案 0 :(得分:4)

使用Convert.ToInt32(不确定您的LINQ提供商是否支持int.Parse

var temp = Dsrm.OrderBy(x => Convert.ToInt32(x.IST)); 

当然,与首先使用正确的类型相比,效率更低,安全性更低。

答案 1 :(得分:1)

因为它是一个字符串,它有点困难,我会实现一个自定义的IComparer<T>类。根据我的收集,项目的结构可以是数字,也可以是数字后跟字母的组合。如果是这种情况,则以下IComparer<T>实现应该可以正常工作

public class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        var regex = new Regex("^(d+)");

        // run the regex on both strings
        var xRegexResult = regex.Match(x);
        var yRegexResult = regex.Match(y);

        // check if they are both numbers
        if (xRegexResult.Success && yRegexResult.Success)
        {
            return int.Parse(xRegexResult.Groups[1].Value).CompareTo(int.Parse(yRegexResult.Groups[1].Value));
        }

        // otherwise return as string comparison
        return x.CompareTo(y);
    }
}

使用此IComparer<T>,您可以通过执行

对字符串列表进行排序
var myComparer = new CustomComparer();
var temp.Sort(myComparer);