我一直试图想出一种聪明的方法来在Linq中订购我的名单而没有太大的成功。
我有一个班级
public class SafeFloatDenomination
{
public string Denomination { get; set; }
public decimal Value { get; set; }
}
我从数据库中填写此类,并且应该有一个List。 我想做的是按照以下方式按名称命令列表:
[£50,50p,£20,20p,£10,10p,£5,5p,£2,2p,£1,1p]
我一直在绞尽脑汁,到目前为止我唯一能够开始工作的方法是获取我想要的价值并将其添加到新列表中的相当无趣的方法
var l = this._bankingManager.GetSafeFloatCash().OrderByDescending(x => x.Denomination);
List<SafeFloatDenomination> orderedDenoms = new List<SafeFloatDenomination>();
SafeFloatDenomination itemToAdd = null;
itemToAdd = l.SingleOrDefault(x=>x.Denomination=="£50");
if ( itemToAdd!=null)
{
orderedDenoms.Add(itemToAdd);
}
itemToAdd = l.SingleOrDefault(x => x.Denomination == "50p");
if (itemToAdd != null)
{
orderedDenoms.Add(itemToAdd);
}
itemToAdd = l.SingleOrDefault(x => x.Denomination == "£20");
if (itemToAdd != null)
{
orderedDenoms.Add(itemToAdd);
}
itemToAdd = l.SingleOrDefault(x => x.Denomination == "20p");
if (itemToAdd != null)
{
orderedDenoms.Add(itemToAdd);
}
我更喜欢做的是剥离£/ p并订购desc,但这也可以很容易地为Euro / c或$ / c
我认为最好的方法是创建单独的£和p列表,但是从每个列表中选择匹配值并不简单:
var poundList = l.Where(x => x.Denomination.Substring(0,1) == "£");
var penceList = l.Where(x => x.Denomination.Substring(0,1) != "£");
// then add into a new list
答案 0 :(得分:0)
Regex r = new Regex(@"(\d+)");
list.OrderByDescending(x => int.Parse(r.Match(x.Denomination).Groups[1].Value))
.ThenBy(x => x.Denomination);