繁体   English   中英

如何根据 C# 中列表中的列表值对列表进行排序?

[英]How to Sort a List based on the value of a list within the list in C#?

可能这个问题有点令人困惑,但基本上我有一个列表,其中包含另一个列表。 像这样:

public class Transaction
{
    public string TransactionType { get; set; }
    public List<TransactionDetails> Details { get; set; } = new List<TransactionDetails>();
}

public class TransactionDetails
{
    public string TransactionDate { get; set; }
    public double TransactionAmount { get; set; }
    public double TransactionBalance { get; set; }
}

现在,我想根据TransactionDetails 列表中的 TransactionDate 对 Transaction列表进行排序。 如果假设我只想根据TransactionType对其进行排序,我知道这是这样做的方法:(假设我已经添加了列表)

    List<Transaction> listTransactions;
    List<Transaction> sortedListTransactions;

    sortedListTransactions = listTransactions
        .OrderBy(x => x.TransactionType)
        .ToList();

我试过了,这很有效。 但是,当我对我的案例应用基本相同的方法时,即基于TransactionDate对列表进行排序时,它并没有给我所需的答案。 请让我知道是否有任何方法可以实现这一目标..

如果您必须对列表进行排序,则必须选择一个定义顺序的元素(如值、日期等)。如果您喜欢用于排序的属性也是列表,则必须选择一个元素从该内部列表(例如 min、max、first、last)或将所有内部列表值(如 sum、average、median、concat)聚合为一个值。

在您的情况下,一种方法可能是在内部列表中找到最小元素,并将其用作对外部元素进行排序的标准。 这可能是这样的:

var sortedTransactions = transactions
        .OrderBy(transaction => transaction.Details
                                    .OrderBy(detail => detail.TransactionDate)
                                    .FirstOrDefault())
        .ToList();

从您的示例中,从内部列表中对外部元素进行排序的另一种可能性是获取所有交易金额的总和,如下所示:

var sortedTransactions = transactions
        .OrderBy(transaction => transaction.Details
                                    .Sum(detail => detail.TransactionAmount))
        .ToList();

尽管如此,您可以定义每个级别的排序标准,然后让它冒泡以返回排序标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM