linq 按转换为int的字符串对列表排序

mutmk8jj  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(146)

我有一个保存为字符串的Int列表,我想对它们进行排序。我提出了以下解决方案:

sortList = sortList.OrderByDescending(x => Convert.ToInt32(x.Number)).ToList();

它可以完美地工作,但只有当列表only包含数字时才可以。例如,如果有一个项目是像"???"这样的字符串,排序完全失败。
期望值:

['313', '309', '119', '49', '???']

结果:

['309' '49' '313' '119' '???']
szqfcxe2

szqfcxe21#

因此,需要使用int.TryParse()并为无效字符串返回一个低值:

sortList = sortList.OrderByDescending(x =>
    {
        int i;
        return int.TryParse(x.Number, out i) ? i : int.MinValue;
    });

我使用OrderByDescending而不是OrderBy,因为您显示的预期结果是按降序排列的。

sirbozc5

sirbozc52#

C# 7中,您可以将其减少到只有一行,同时仍然使用TryParse(),方法是使用out-变量:

sortList = sortList.OrderBy(x => Int32.TryParse(x.Number, out var i) ? i : Int32.MinValue).ToList();
n53p2ov0

n53p2ov03#

排序任何类型的输入列表(例如PROP01),选择要转换的属性(例如XSTRING1_FIELD)。返回排序后的输入列表。

private static List<PROP01> _getListPROP01OrderedByXSTRING1_FIELD(List<PROP01> iList)
    {
        // INIT
        List<PROP01> retObj = new List<PROP01>();
        int tempKey = 0;
        int jj = 0;
        // GET 
        SortedList<int, PROP01> tempSorted = new SortedList<int, PROP01>();

        foreach (var currObj in iList)
        {                
            try {
                tempKey = Convert.ToInt32(currObj.XSTRING1_FIELD);
            }
            catch (Exception) {
                tempKey = (Int32.MaxValue - jj);
                ++jj;
            }
            tempSorted.Add(tempKey, currObj);
        }
        foreach (KeyValuePair<int, PROP01> currObj in tempSorted)
        {
            // retObj.Add(currObj.Value);  // ascending order
            retObj.Insert(0, currObj);     // descending order
        }
        // RET
        return retObj;
    }

相关问题