我一直在尝试一种巧妙的方法来在Linq上订购我的列表,但收效甚微。
我有一堂课
public class SafeFloatDenomination
{
public string Denomination { get; set; }
public decimal Value { get; set; }
}
我从数据库填充此类,并且应该有一个列表。
然后,我想通过以下方式按面额对列表进行排序:
[£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
最佳答案
Regex r = new Regex(@"(\d+)");
list.OrderByDescending(x => int.Parse(r.Match(x.Denomination).Groups[1].Value))
.ThenBy(x => x.Denomination);
关于c# - 按货币值排序列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29493296/