如何使用LINQ将特定字段与子列表合并



考虑到我有2个列表(listaproducto1和listaproducto2),两者具有相同的属性,但具有不同的值。

我需要结果合并两个列表,但它必须考虑列表中对应的id。

productos = idproducto/tipostiularidade = idTipoTitularidade/Faixa = idFaixa

我已经尝试过遵循其他类似的主题,但这对我来说要复杂得多。

这是我期望的结果:

  1. listaProduto1listaProduto2合并而成的Produtos=idProduto,TiposTitularidade=idTipoTitularidade,Faixa=idFaixa的返回列表组;
  2. 字段quantidadeClientes,valor必须求和,以防idFaixa在两个列表中都匹配。

代码如下:

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

}
}
}

我认为这里需要一个平衡的线合并。使用id对两个列表进行排序。将两个列表推进到第一个项目,并进入循环,直到两个列表耗尽。比较两个列表中的当前项目。如果a比b大,将b加到结果中,并推进b,反之亦然。如果两者相同,则处理a和b并推进两个列表。

下面是每次迭代的图解说明。

迭代1:

1 <-->  2    Handle 1 and advance list 1
2       4
3       5
4       6

迭代2:

2 <-->  2    Handle both and advance both lists
3       4
4       5
6

迭代3:

3 <-->  4    Handle 3 and advance list 1
4       5
6

迭代4:

4 <-->  4    Handle both and advance both
5
6

迭代5:

?-->  5    List 1 is exhausted handle 5 and advance list 2
6

迭代6:

?-->  6    List 1 is exhausted handle 6 and advance list 2

迭代7:

?--?       finished

最新更新