我有一个搜索结果表,其中的列包含有限的值,可以
"Completed", "Recruiting", "Active and not Recruiting" 我希望"Recruiting“排在第一位,然后是"Active and not Recruiting”,最后是"Completed“。
我使用的表达式是这样的
List<Search> lst = new List<Search>();
var hello = db.tblSomething.Where(em=>em.someid==obj.someid).ToList
foreach(item in hello)
{
SomeClass obj1 = new SomeClass();
obj1.Status = hello.Status;
lst.Add(obj1);
}状态可以包含“已完成”、“招聘”、“活动”和“未招聘”中的任何一个。
招聘状态元素最先出现的表达式是什么?
发布于 2016-05-02 01:10:26
我希望"Recruiting“列排在第一位,然后是"Active and not Recruiting”,最后是"Completed“。
使用OrderBy。
public static void Main()
{
var list = new List<SomeClass>
{
new SomeClass{ Status = "Recruiting"},
new SomeClass{ Status = "Completed"},
new SomeClass{ Status = "Active and not Recruiting"},
new SomeClass{ Status = "Completed"},
new SomeClass{ Status = "Recruiting"}
};
PrintList(list);
Console.WriteLine("-");
var sorted = list
.OrderBy(sc => sc.Status.Equals("Recruiting", StringComparison.OrdinalIgnoreCase)
? 0
: sc.Status.Equals("Active and not Recruiting", StringComparison.OrdinalIgnoreCase)
? 1
: sc.Status.Equals("Completed", StringComparison.OrdinalIgnoreCase)
? 2
: 3)
.ToList();
PrintList(sorted);
}
public static void PrintList(IEnumerable<SomeClass> list)
{
foreach(var sc in list) Console.WriteLine(sc.Status);
}
public class SomeClass
{
public string Status { get; set; }
}结果:
回收
已完成
主动招聘和非招聘
已完成
再利用
-
再利用
再利用
主动招聘和非招聘
已完成
已完成
这一切都很好,但是非常丑陋并且非常脆弱的代码。相反,我强烈建议使用 和 。
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class Program
{
public enum StatusType
{
[Display(Name = "Invalid", Order = -1)]
Invalid = 0,
[Display(Name = "Recuiting", Order = 0)]
Recruiting,
[Display(Name = "Completed", Order = 2)]
Completed,
[Display(Name = "Active and not Recruiting", Order = 1)]
ActiveAndNotRecruiting
}
public static void Main()
{
var list = new List<SomeClass>
{
new SomeClass{ Status = StatusType.Recruiting, Id = 1, Name = "Abraham"},
new SomeClass{ Status = StatusType.Completed, Id = 2, Name = "Ben"},
new SomeClass{ Status = StatusType.ActiveAndNotRecruiting, Id = 3, Name = "Carl"},
new SomeClass{ Status = StatusType.Completed, Id = 4, Name = "Dan"},
new SomeClass{ Status = StatusType.Recruiting, Id = 5, Name = "Erin"}
};
PrintList(list);
Console.WriteLine("-");
var sorted = list
.OrderBy(cs => cs.Status.ToDisplay().Order)
.ToList();
PrintList(sorted);
}
public static void PrintList(IEnumerable<SomeClass> list)
{
foreach(var sc in list) Console.WriteLine("{0}, {1} is {2}", sc.Id, sc.Name, sc.Status.ToDisplay().Name);
}
public class SomeClass
{
public int Id { get; set; }
public string Name { get; set; }
public StatusType Status { get; set; }
}
}
public static class EnumExtensions
{
public static DisplayAttribute ToDisplay(this Enum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttributes(false)
.Where(a => a is DisplayAttribute)
.FirstOrDefault() as DisplayAttribute;
}
}结果:
1,亚伯拉罕正在休养
2、本已完成
3,卡尔是活跃的,不是招聘
4、丹完成了
5,Erin正在恢复
-
1,亚伯拉罕正在休整
5,Erin正在恢复
3,卡尔是活跃的,不是招聘
2、本已完成
4、丹完成了
使用Enum的优点是属性和排序的名称被封装到单个逻辑位置中。如果您想要更改顺序,可以在单个位置执行此操作,确保其他所有内容都会更改,并且不会破坏任何其他内容。这也消除了magic numbers/strings的使用。
发布于 2016-05-02 00:51:50
使用List<T>.Sort(Comparison<T>)方法。根据需要定义您对Search的比较。请参阅https://msdn.microsoft.com/en-us/library/w56d4y5z(v=vs.110).aspx
https://stackoverflow.com/questions/36969118
复制相似问题