我一直在尝试一种巧妙的方法来在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/

10-12 12:48
查看更多