微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

合并两个列表并排序

如何解决合并两个列表并排序

class A
{
   int id,DateTime joinDate,string name
}

class B
{
   int uniqueId,}

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

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

解决方法

这样的事情可以工作:

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)
    ...
}

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

,

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

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

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,};
        List<ClassB> listB = new List<ClassB>()
        {
            new ClassB(){UniqueId=23,8,new ClassB(){UniqueId=47,JoinDate = new DateTime(2017,};
        
        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;}
}

 
,

填充您的列表 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,Name = string.Empty })
.OrderByDescending(x => x.JoinDate);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。