C# 对字符串属性进行排序,如整数LINQ

C# 对字符串属性进行排序,如整数LINQ,c#,linq,sorting,C#,Linq,Sorting,我有一个项目列表,我正在使用下面的代码对这个项目列表进行排序 List<ModelItems> sorted_items = originalItems.OrderBy(i => i.Page).ToList(); List sorted_items=originalItems.OrderBy(i=>i.Page.ToList(); 其中Page是一个可以是整数或字符串的属性,因此我将其设置为string类型,并且在模型中也不是必需的属性。 所以它也可以是空的 但在排序时,

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

List<ModelItems> sorted_items = originalItems.OrderBy(i => i.Page).ToList();
List sorted_items=originalItems.OrderBy(i=>i.Page.ToList();
其中Page是一个可以是整数或字符串的属性,因此我将其设置为string类型,并且在模型中也不是必需的属性。 所以它也可以是空的

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

我们可以使用Linq对列表进行整数排序吗


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

您需要为字符串实现一个IComparer。看见 在比较器中,您可以检查第一个和字符串是否可以解析为int并相应地执行操作。 您需要处理4个案例:

int,int

整数,字符串

字符串,int

弦,弦

案例1和案例4很简单。在案例2和案例3中,您可以决定是首先使用INT,还是反之亦然。

您可以尝试以下方法:

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();

我做的有点不同,但得到的结果是一样的

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

 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("]");
    }
公共静态无效显示列表(此列表)
{
控制台。写(“[”);
foreach(列表中的T)
{
控制台写入(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();
    }
public void DoSort()
{
列出已排序的_items=originalItems.Where(i=>i.isPageIntegrable()).OrderBy(i=>Int32.Parse(i.Page)).ToList();
列出第二部分=originalItems.Where(i=>!i.isPageIntegrable()).OrderBy(i=>i.Page).ToList();
var final_sorted=sorted_items.Union(第二部分).ToList();
final_sorted.displayList();
Console.ReadKey();
}

结果:

我尝试了此操作,但获取错误无法在此处将类型“string”转换为“int”。OrderBy(x=>(int)x.Page);因为我的页面是String@JMat试试我的更新。
originalItems
是一个列表吗?是的,original也是一个列表,更新解决了这个问题。:)我们还需要做一些轻微的修改。如果页面属性为null,则当前代码返回异常。现在我创建了两个单独的列表1。空列表&1个非空列表,然后像这样进行最后的并集。在模型项类中是否有更好的方法实现ICM?然后就是coll originalItems.OrderBy()。