C# 合并两个不同的列表,然后按c上的公共属性排序?

C# 合并两个不同的列表,然后按c上的公共属性排序?,c#,linq,C#,Linq,我有三个这样的物体: public class MontoAPagar { public int IdComprobante { get; set; } public int IdMovimiento { get; set; } public decimal Monto { get; set; } protected MontoAPagar(in

我有三个这样的物体:

public class MontoAPagar {
    public int IdComprobante {
        get;
        set;
    }
    public int IdMovimiento {
        get;
        set;
    }
    public decimal Monto {
        get;
        set;
    }
    protected MontoAPagar(int idComprobante, int idMovimiento, decimal monto) {
        IdComprobante = idComprobante;
        IdMovimiento = idMovimiento;
        Monto = monto;
    }
    protected MontoAPagar() {}
}
public class PagoInfoDBO: MontoAPagar {
    public int IdPago {
        get;
        set;
    }
    public PagoInfoDBO(): base() {}
    public PagoInfoDBO(int idPago, int idComprobante, int idMovimiento, decimal monto): base(idComprobante, idMovimiento, monto) {
        IdPago = idPago;
    }
}
public class ComprobanteMontoDBO: MontoAPagar {
    public TipoComprobante TipoDeComprobante {
        get;
        set;
    }
    public ComprobanteMontoDBO(TipoComprobante tipoDeComprobante, int idComprobante, int idMovimiento, decimal monto): base(idComprobante, idMovimiento, monto) {
        TipoDeComprobante = tipoDeComprobante;
    }
    public ComprobanteMontoDBO() {}
}
然后我有一个方法,它采用了两个列表List pagos和List montosDebitoCredito,对另一个对象执行一些计算,这与这个问题无关

我需要做的是先把pagos和Montos带到Credito。。按属性IdComprobante对它们进行分组,然后按IDMOVIMINTO属性对分组列表进行排序


我如何才能做到这一点?

试一试,看看它是如何为您服务的:

        List<B> listB;
        List<C> listC;
        List<A> concatList = new List<A>();
        concatList.AddRange(listB);
        concatList.AddRange(listC);
        List<A> orderedList = concatList.OrderBy(prop => prop.ID).ThenBy(prop => prop.AnotherID).ToList();
取决于你说的“交集”到底是什么意思我想

var result = (from b in listB 
join c listC on b.id equals c.id into group
from g in group.DefaultIdEmpty()
select 
    g.AnotherId, 
    b.somefield, 
    c.anotherfield
).OrderBy(x = > x.AnotherId)
编辑


你是说像这样的

        static void Main() {
            var pagos = new List<PagoInfoDBO>();
            var montosDebitoCredito  = new List<ComprobanteMontoDBO>();

            var query = pagos.Cast<MontoAPagar>().Concat(montosDebitoCredito.Cast<MontoAPagar>())
                .GroupBy(item=> item.IdComprobante)
                .Select(g=> new {
                            IdComprobante = g.Key, 
                            SortedByIdMovimiento = g.OrderBy(item=> item.IdMovimiento).ToArray()
                        }).ToArray();

不清楚相交部分从哪里来。显示真实代码而不是伪代码,以及输入数据、预期输出和您自己的进展情况的示例,会很有帮助。INTESTICT是因为我需要通过Id属性将A类列表与B类列表相交。也许intersect不是正确的词?我不知道intersect是否是正确的词-如果您提供了我要求的完整代码和示例,就更容易判断了…Concat和intersect之间有什么区别?listB.ConcatlistC甚至不会编译-它们是不同的类型。@Jonsket我的错误,我会用一个基类列表来编辑我的印象是他只是想让它们先按ID排序,然后再按每个ID中的另一个ID排序。结果与按ID分组,然后按另一个ID排序,然后展平的结果相同。我想要两个列表。。按Id对它们进行分组,然后按另一个Id对结果列表进行排序……为什么这能回答这个问题?它做什么?这回答了问题,因为它是问题的解决方案。它pagos和left out通过IdComprobante将montosDebitoCredito加入组“group”,然后由IDMoviMinto排序。您的答案会在我处理它的低质量队列中弹出。我留下评论是为了鼓励您不仅在回答中转储代码,而且尝试解释一下它的作用,以便对OP和其他访问者有用。您的评论文本可能是一个良好的开端。。祝你好运
        static void Main() {
            var pagos = new List<PagoInfoDBO>();
            var montosDebitoCredito  = new List<ComprobanteMontoDBO>();

            var query = pagos.Cast<MontoAPagar>().Concat(montosDebitoCredito.Cast<MontoAPagar>())
                .GroupBy(item=> item.IdComprobante)
                .Select(g=> new {
                            IdComprobante = g.Key, 
                            SortedByIdMovimiento = g.OrderBy(item=> item.IdMovimiento).ToArray()
                        }).ToArray();