代码之家  ›  专栏  ›  技术社区  ›  A.Learn

基于某些条件的c#排序列表

  •  -2
  • A.Learn  · 技术社区  · 7 年前

    我想以最有效的方式对条目列上给定列表中的条目进行排序。下面是我的i条目的示例。

    #No Detail                                 Entry          Number          Rate
    1   Carpool at 5$                          C              1               5
        Carpool at 5$                          H              2               5
    
    2   Played Cricket at 2$                   X              1               2
        Played Cricket at 2$                   O              2               2
    
    3   Done something at 4$                  ""              0               4
    
    4   Done something else at 9$              M              1               9
    
    5   Watched movie at 6$                    B              1               6
        Watched movie at 6$                    Z              2               6
    

    1. 列表中没有列不可用。我刚才提到这里是想详细介绍一下参赛作品。
    2. 专业,他们的速度和描述将是相同的和 数字应该是1和2。
    3. 如果输入值为空,则此类输入的数字将设置为0。例如3
    4. 单个条目的值,并且将没有对和数字列 这样的条目将被设置为1,并且中不会有任何条目
    5. 对条目列上的clubbed条目进行排序时,只考虑条目

    我想按照上述规则按升序或降序对条目列进行排序。

    我的解决方案:

    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        internal class Data
        {
            public string Detail { get; set; }
            public string Entry { get; set; }
            public int Number { get; set; }
            public int Rate { get; set; }
        }
    
        internal class Program
        {
            private static void Main(string[] args)
            {
                List<Data> entries = new List<Data>();
    
                // Clubbed entry...While sorting only consider entry with Number set to 1. They will have same rate and Detail.
                entries.Add(new Data() { Detail = "Carpool at 5$", Entry = "C", Number = 1, Rate = 5 });
                entries.Add(new Data() { Detail = "Carpool at 5$", Entry = "H", Number = 2, Rate = 5 });
    
                // Clubbed entry
                entries.Add(new Data() { Detail = "Played Cricket at 2$", Entry = "X", Number = 1, Rate = 2 });
                entries.Add(new Data() { Detail = "Played Cricket at 2$", Entry = "O", Number = 2, Rate = 2 });
    
                // entry which have empty Entry value such entries will have Number set to 0
                entries.Add(new Data() { Detail = "Done something at 4$", Entry = "", Number = 0, Rate = 4 });
    
                // entry which will not have an pair and Number column for such entries would be set to 1 and 
                // there wouldn't be any entry in list which have same detail and rate with Number coloumn set to 2
                entries.Add(new Data() { Detail = "Done something else at 9$", Entry = "M", Number = 1, Rate = 9 });
    
                // Clubbed entry
                entries.Add(new Data() { Detail = "Watched movie at 6$", Entry = "B", Number = 1, Rate = 6 });
                entries.Add(new Data() { Detail = "Watched movie at 6$", Entry = "Z", Number = 2, Rate = 6 });
    
                // Sorting on Entry Coloumn
                var sortedList = entries.GroupBy(x => x.Detail).OrderBy(x => x.FirstOrDefault(y => y.Number <= 1).Entry).SelectMany(x => x).ToList();
    
            }
        }
    }
    

    Detail                                 Entry          Number          Rate  
    Done something at 4$                  ""              0               4
    
    Watched movie at 6$                    B              1               6
    Watched movie at 6$                    Z              2               6
    
    Carpool at 5$                          C              1               5
    Carpool at 5$                          H              2               5
    
    Done something else at 9$              M              1               9
    
    Played Cricket at 2$                   X              1               2
    Played Cricket at 2$                   O              2               2
    

    • 我的解决方案不考虑费率,只根据分组的详细情况,就可以了 可以修改吗?
    1 回复  |  直到 7 年前
        1
  •  1
  •   NetMage    7 年前

    FirstOrDefault 你应该处理一下 null 返回 ?. . 如果你不应该有一个不包含 Number First . 你应该根据 数字 :

    var sortedList = entries.GroupBy(x => new { x.Detail, x.Rate })
                            .OrderBy(x => x.FirstOrDefault(y => y.Number <= 1)?.Entry)
                            .SelectMany(x => x.OrderBy(z => z.Number))
                            .ToList();