我有一个项目列表,我使用以下代码对这个项目列表进行排序
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”,“”,.....
答案 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();
}
结果: