合并两个列表并排序

时间:2021-02-01 08:13:29

标签: c# xamarin

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()???基于joinDate

3 个答案:

答案 0 :(得分: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)
    ...
}

我确实认为这些类应该从一个共同的祖先继承或实现一个共同的接口的评论中的建议会让它们更容易使用..

答案 1 :(得分:0)

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

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

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;}
}

 

答案 2 :(得分:0)

填充您的列表 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);
相关问题