'How to merge two lists using LINQ Suming especifics fields with sublists
Considering I have 2 list (listaProduto1 and listaProduto2), both with same properties, but with different values.
I need the result merge both lists, but it must consider the correspond id`s in which list.
Produtos = idProduto / TiposTitularidade = idTipoTitularidade / Faixa = idFaixa
I've tried to follow other similar topics, but this is much more complex for me.
This is my expected result:
- a return list merged group by
Produtos
=idProduto
,TiposTitularidade
=idTipoTitularidade
,Faixa
=idFaixa
merged fromlistaProduto1
andlistaProduto2
; - the fields
quantidadeClientes
,valor
must be summed in caseidFaixa
matches in both lists.
Here is the code:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
public class Program1
{
public class Data
{
public List<Produto> produtos { get; set; }
}
public class Faixa
{
public int idFaixa { get; set; }
public int quantidadeClientes { get; set; }
public double valor { get; set; }
}
public class Produto
{
public string idProduto { get; set; }
public List<TiposTitularidade> tiposTitularidades { get; set; }
}
public class TiposTitularidade
{
public int idTipoTitularidade { get; set; }
public List<Faixa> faixas { get; set; }
}
public static void Main()
{
List<Faixa> listafaixas1 = new List<Faixa>()
{
new Faixa { idFaixa=1, quantidadeClientes = 2, valor = 32.2},
new Faixa { idFaixa=2, quantidadeClientes = 4, valor = 62.2},
new Faixa { idFaixa=4, quantidadeClientes = 6, valor = 165.7},
new Faixa { idFaixa=7, quantidadeClientes = 126, valor = 234},
};
List<Faixa> listafaixas1p = new List<Faixa>()
{
new Faixa { idFaixa=7, quantidadeClientes = 126, valor = 234},
};
List<Faixa> listafaixas2 = new List<Faixa>()
{
new Faixa { idFaixa=1, quantidadeClientes = 4, valor = 25.45},
new Faixa { idFaixa=3, quantidadeClientes = 7, valor = 45.12},
new Faixa { idFaixa=4, quantidadeClientes = 3, valor = 112.18},
new Faixa { idFaixa=7, quantidadeClientes = 34, valor = 278},
};
List<Faixa> listafaixas2p = new List<Faixa>()
{
new Faixa { idFaixa=7, quantidadeClientes = 34, valor = 278},
};
List<TiposTitularidade> listaTiposTitularidade1 = new List<TiposTitularidade>()
{
new TiposTitularidade { idTipoTitularidade=1, faixas = listafaixas1},
new TiposTitularidade { idTipoTitularidade=2, faixas = listafaixas1p},
};
List<TiposTitularidade> listaTiposTitularidade2 = new List<TiposTitularidade>()
{
new TiposTitularidade { idTipoTitularidade=1, faixas = listafaixas2},
new TiposTitularidade { idTipoTitularidade=2, faixas = listafaixas2p},
};
List<Produto> listaProduto1 = new List<Produto>()
{
new Produto { idProduto= "1", tiposTitularidades = listaTiposTitularidade1},
new Produto { idProduto= "2", tiposTitularidades = listaTiposTitularidade1},
};
List<Produto> listaProduto2 = new List<Produto>()
{
new Produto { idProduto= "1", tiposTitularidades = listaTiposTitularidade2},
new Produto { idProduto= "3", tiposTitularidades = listaTiposTitularidade2},
};
}
}
}
Solution 1:[1]
I think you need a balanced line merge here. Sort both lists using the id. Advance both lists to the first item and enter a loop until both lists are exhausted. Compare the current items in both lists. If a is bigger b than add b to the result and advance b and vice versa. If both are the same handle a and b and advance both lists.
Below is a graphical explanation of each iteration.
Iteration 1:
1 <--> 2 Handle 1 and advance list 1
2 4
3 5
4 6
Iteration 2:
2 <--> 2 Handle both and advance both lists
3 4
4 5
6
Iteration 3:
3 <--> 4 Handle 3 and advance list 1
4 5
6
Iteration 4:
4 <--> 4 Handle both and advance both
5
6
Iteration 5:
?--> 5 List 1 is exhausted handle 5 and advance list 2
6
Iteration 6:
?--> 6 List 1 is exhausted handle 6 and advance list 2
Iteration 7:
?--? finished
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Paul Sinnema |