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