对字符串属性进行排序,如Integer LINQ

时间:2015-03-28 05:23:13

标签: c# linq sorting

我有一个项目列表,我使用以下代码对这个项目列表进行排序

List<ModelItems> sorted_items = originalItems.OrderBy(i => i.Page).ToList();

其中Page是一个可以是整数或字符串的属性,因此我将其设置为String类型,并且也不是模型中的必需属性。 所以它也可以是空的。

但是在排序时,由于它现在是一个字符串,它按此顺序给出了项目,例如1,17,3,37,5,“”,“s”等

我们可以使用Linq以整数方式对List进行排序吗?

喜欢结果应该是数字首先,然后字符串如1,3,5,17,37,“b”,“g”,“”,.....

3 个答案:

答案 0 :(得分:4)

您需要为String实现IComparer。见Use own IComparer<T> with Linq OrderBy。 在比较器中,您可以检查第一个和字符串是否可以解析为int并相应地执行操作。 你有4个案件要处理:

int,int

int,string

string,int

string,string

案例1和案例4很简单。在第2和第3种情况下,您可以决定是先进行整数还是反之亦然。

答案 1 :(得分:2)

你可以试试这个:

var firstPart = originalItems.Where(x => !String.IsNullOrEmpty(x) && x.Page.All(char.IsDigit)).OrderBy(x => Convert.ToInt32(x.Page));
var secondPart = originalItems.Where(x => !String.IsNullOrEmpty(x) && !x.Page.All(char.IsDigit)).OrderBy(x => x.Page);
var thirdPart = originalItems.Where(x => String.IsNullOrEmpty(x)).ToList();

var result = firstPart.Union(secondPart).Union(thirdPart).ToList();

答案 2 :(得分:1)

我做的有点不同但得到了相同的结果

首先我创建了一个扩展方法

 public static class CollectionsUtils
{
    public static bool isPageIntegrable(this ModelItems modelItem)
    {
        int integrable = 0;
        bool result = Int32.TryParse(modelItem.Page,  out integrable);
        return result;
    }

....

第二种方法,我用来显示列表

  public static void displayList<T>(this List<T> list)
    {
        Console.Write("[");
        foreach (T t in list)
        {
            Console.Write(t);
        }
        Console.WriteLine("]");
    }

然后我创建以下DoSort方法

 public void DoSort()
    {
        List<ModelItems> sorted_items = originalItems.Where(i => i.isPageIntegrable()).OrderBy(i => Int32.Parse( i.Page)).ToList();
        List<ModelItems> second_part = originalItems.Where(i => !i.isPageIntegrable()).OrderBy(i => i.Page).ToList();
        var final_sorted = sorted_items.Union(second_part).ToList();

        final_sorted.displayList();
        Console.ReadKey();
    }

结果:sort