考虑到我有2个列表(listaproducto1和listaproducto2),两者具有相同的属性,但具有不同的值。
我需要结果合并两个列表,但它必须考虑列表中对应的id。
productos = idproducto/tipostiularidade = idTipoTitularidade/Faixa = idFaixa
我已经尝试过遵循其他类似的主题,但这对我来说要复杂得多。
这是我期望的结果:
- 由
listaProduto1
和listaProduto2
合并而成的Produtos
=idProduto
,TiposTitularidade
=idTipoTitularidade
,Faixa
=idFaixa
的返回列表组; - 字段
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