根据嵌套列表对列表进行排序

时间:2020-07-02 08:24:35

标签: c#

我有两个c#类-主题和订阅。

主题:

    public class Topics
{
    public string TopicName { get; set; }
    public List<Subscriptions> Subscriptions { get; set; }

}

订阅:

    public class Subscriptions
{
    public string SubscriptionName { get; set; }
    public string MessageCount { get; set; }

}

这些类从azure总线中提取数据并计算每个订阅上的消息。

我将此数据输出到一个表,并放入一个过滤器中,以根据过滤器对表进行排序。我已经设法完成了很多排序工作,但是当尝试通过Subscriptions类中的表对表中的任何内容进行排序时,我无法使其工作。我正在尝试通过开关来做到这一点:

    public List<Models.Topics> TopicsList { get; set; }
    public List<Models.Topics> Topics { get; set; } 
public List<Models.Subscriptions> Subscriptions { get; set; }

        public subCounterModel()
    {
        Topics = ad.GetSubscriptionData();
        list = val.getListVaules();
    }
    public void OnGet()
    {
switch (filter)
            {
                case "1": //Topic Name - ascending
                        TopicsList = Topics
                            .OrderBy(t => t.TopicName)
                            .Skip((P - 1) * S)
                            .Take(S)
                            .ToList();
                    break;
                case "2": //Topic Name - Descending
                        TopicsList = Topics
                            .OrderByDescending(t => t.TopicName)
                            .Skip((P - 1) * S)
                            .Take(S)
                            .ToList();
                    break;
                case "3": //Subscription Name - Ascending
                        TopicsList = Topics
                            .OrderBy(t => t.Subscriptions.Min(s => s.SubscriptionName))
                            .Skip((P - 1) * S)
                            .Take(S)
                            .ToList();
                    break;
                case "4": //Subscription Name - Descending
                        TopicsList = Topics
                            .OrderByDescending(x => x.Subscriptions.Min(m => m.SubscriptionName))
                            .Skip((P - 1) * S)
                            .Take(S)
                            .ToList();
                    break;
                case "5": // Message Count - Ascending
                        TopicsList = Topics
                            .OrderBy(t => t.Subscriptions.Min(s => s.MessageCount))
                            .Skip((P - 1) * S)
                            .Take(S)
                            .ToList();
                    break;
                case "6": //Message Count - Descending
                        TopicsList = Topics
                            .OrderByDescending(x => x.Subscriptions.Min(m => m.MessageCount))
                            .Skip((P - 1) * S)
                            .Take(S)
                            .ToList();
                    break;
            }
}

案例1和2可以正常工作,但是3-6不能按我的预期工作。从某种意义上说,它可以按消息计数对对象进行排序,但是不能正确地对外层进行排序。我该如何重做,以便可以按messagecount和subscriptionname排序?

示例:

选择过滤器“消息计数-升序”会将字符串值“ 5”传递到我的交换机。运行。似乎正在发生的事情是它将按订阅对每个主题进行排序,然后按顺序列出这些主题。因此,如果我有一个名为“ Topic1”的主题,其中包含15个订阅,则这15个主题似乎已正确排序,但是它将(正确排序的)“ Topic2”放在主题1下,而不是对结果进行“合并”在桌子上。我认为我需要做的是为一个主题拥有多个订阅的每个实例创建一个新的Topic对象,然后按照该主题进行排序,但是我不确定在lambda查询中如何做到这一点。

enter image description here

这是我按订阅名称排序的一个示例。出于隐私原因,删除了一些数据。它可以正确地对主题进行排序,但是却不符合我的预期。

1 个答案:

答案 0 :(得分:0)

您可能想要做的是平整订阅,然后排序。

看起来像这样:

var subsTopics = Topics.SelectMany(t => t.Subscriptions, (topic, sub) => new { topic.TopicName, sub.MessageCount, sub.SubscriptionName });

然后您可以在此结束时卡住OrderBy

subsTopics.OrderBy(o => o.SubscriptionName);

SelectMany当提供许多IEnumerables时会将它们组合成一个序列-有一些重载,并且其中一个允许您提供转换函数(为此我提供了lambda表达式)