【问题标题】:Merge Two List and Sort [duplicate]合并两个列表并排序[重复]
【发布时间】:2021-02-01 08:13:29
【问题描述】:
class A
{
   int id,
   DateTime joinDate,
   string name
}

class B
{
   int uniqueId,
   DateTime joinDate,
}

我有两个包含上述对象的列表

List<A> listofA
List<B> listofB

我想
将这两个列表合并成一个新列表,然后按日期时间对新列表进行排序
这是两个列表共有的。

我已经按照this link了解了合并逻辑。

请提供一个可行的解决方案来理解这种排序逻辑

目前的结果

List<object> mergedList = (from x in A select (Object)x).ToList();
mergedList.AddRange((from x in B select (Object)x).ToList());

mergedList.Orderby()???基于加入日期

【问题讨论】:

  • 好吧,你不能有List&lt;A and B&gt;。所以你必须创建一个继承自/实现的基类或接口。这是唯一的“硬”部分。之后,合并两个列表和排序列表都是非常常见的步骤,已经被询问和回答了数千次。寻找解决方案应该不难。
  • @Sachith 这部分没问题...我理解合并,排序是这里的主要问题
  • @HimBromBeere 在这里,我很难根据两个类的公共变量对新的合并列表进行排序。
  • 无论如何我强烈反对使用List&lt;object&gt;,因为你不能用object做很多事情。但是,您应该提取两种类型都实现/继承的基接口或类。

标签: c# xamarin


【解决方案1】:

这样的事情可能会起作用:

var m = A.Select(a => new { a.JoinDate, O = (object)a })
  .Concat(B.Select(b => new { b.JoinDate, O = (object)b }))
  .OrderBy(c => c.JoinDate);

但请注意,对于列表中的每个项目,您将不得不询问 O 是 ClassA 还是 ClassB

for(var x in m){
  if(x.O is ClassA)
    ...
}

我确实认为 cmets 中关于这些类应该继承自一个共同祖先或实现一个共同接口的建议将使它们更易于使用..

【讨论】:

    【解决方案2】:

    如前所述,如果不使用对象类,就不能合并两个不同的类类型,我建议不要这样做,因为它是引入错误的潜在来源。 最好给每个类一个基接口,并在此基础上使用一个列表。

    然后您需要比较您的属性类型以确定如何最好地对其进行排序。

    using System;
    using System.Collections.Generic;
    using System.Linq;
                    
    public class Program
    {
        public static void Main()
        {
            List<ClassA> listA = new List<ClassA>()
            { 
                new ClassA(){Id=1, JoinDate = new DateTime(2013, 6, 1, 12, 32, 30)},
                new ClassA(){Id=2, JoinDate = new DateTime(2021, 7, 2, 12, 32, 30)},
            };
            List<ClassB> listB = new List<ClassB>()
            {
                new ClassB(){UniqueId=23, JoinDate = new DateTime(2021, 2, 6, 8, 32, 30)}, 
                new ClassB(){UniqueId=47, JoinDate = new DateTime(2017, 2, 6, 8, 32, 30)}, 
            };
            
            List<IJoinDate> listJoinDate = new List<IJoinDate>();
            
            foreach(var item in listA)
            {
                listJoinDate.Add(item);
            }
                
            foreach(var item in listB)
            {
                listJoinDate.Add(item);
            }
            
            listJoinDate.Sort((x,y)=> 
                              {
                                if (x.JoinDate == null && y.JoinDate == null) return 0;
                                else if (x.JoinDate == null) return -1;
                                else if (y.JoinDate == null) return 1;
                                else return x.JoinDate.CompareTo(y.JoinDate);
                              });
            Console.WriteLine("Total records = %d", listJoinDate.Count);
            foreach(var item in listJoinDate)
            {
                Console.WriteLine(item.JoinDate);
            }
            Console.WriteLine("Linq OrderByDescending");
            listJoinDate.AsQueryable().OrderByDescending(x=>x.JoinDate);
            foreach(var item in listJoinDate)
            {
                Console.WriteLine(item.JoinDate);
            }
        
            Console.WriteLine("Linq OrderBy");
            listJoinDate.AsQueryable().OrderBy(x=>x.JoinDate);
            foreach(var item in listJoinDate)
            {
                Console.WriteLine(item.JoinDate);
            }
        }
    }
    public interface IJoinDate
    {
        DateTime JoinDate{get;set;}
    }
    
    public class ClassA :IJoinDate
    {
        public int Id{get;set;}
        public DateTime JoinDate{get;set;}
    }
    public class ClassB :IJoinDate
    {
        public int UniqueId{get;set;}
        public DateTime JoinDate{get;set;}
        public string Name{get;set;}
    }
    
     
    

    【讨论】:

    • 为什么要检查 JoinDate 是否为空?
    【解决方案3】:

    填充您的列表 listofA 和 listofB 并使用以下查询。

    升序

    var mergedList = (from elementA in listofA select new { ID = elementA.id, JoinDate = elementA.joinDate, Name = elementA.name })
    .Concat(from elementB in listofB select new { ID = elementB.uniqueId, JoinDate = elementB.joinDate, Name = string.Empty })
    .OrderBy(x => x.JoinDate);
    

    降序排列

    var mergedList = (from elementA in listofA select new { ID = elementA.id, JoinDate = elementA.joinDate, Name = elementA.name })
    .Concat(from elementB in listofB select new { ID = elementB.uniqueId, JoinDate = elementB.joinDate, Name = string.Empty })
    .OrderByDescending(x => x.JoinDate);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      相关资源
      最近更新 更多