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();