私はクライアントの第三者サービスで、製品やサービスのリストを提供しています。これはちょっと混乱しています。C#Linq GroupByとSelect performance
例えば、product
しかしproduct
repeats itself
ためservices
のすべてが返されるリスト:
製品はサービスを有しともサービスBを有する製品私はリストを受け取ったときに2つの製品AとサービスAとB
私がする必要があるのは、すべての製品をグループ化してそのサービスのすべてを1つにすることです。私はそれを行っていますが、私のソリューションは「ベスト」ではないと思うのでパフォーマンスが心配です。
var productsNormalized = products.Data.AsEnumerable().Select(x => new ProdutoSSO
{
CodigoServico = int.Parse(string.IsNullOrEmpty(x["CodigoServico"].ToString()) ? "0" : x["CodigoServico"].ToString()),
CodigoPeca = int.Parse(string.IsNullOrEmpty(x["CodigoPeca"].ToString()) ? "0" : x["CodigoPeca"].ToString()),
CodigoFamilia = int.Parse(string.IsNullOrEmpty(x["CodigoFamilia"].ToString()) ? "0" : x["CodigoFamilia"].ToString()),
Familia = x["Familia"].ToString(),
Servico = x["Servico"].ToString(),
Peca = x["Peca"].ToString(),
Hash = x["Hash"].ToString(),
Valor = decimal.Parse(string.IsNullOrEmpty(x["Valor"].ToString()) ? "0" : x["Valor"].ToString())
})
.GroupBy(x => new { x.CodigoPeca, x.CodigoFamilia, x.Familia, x.Peca })
.Select(x => new ProdutoGroup
{
Produto = new Produto
{
CodigoPeca = x.Key.CodigoPeca,
CodigoFamilia = x.Key.CodigoFamilia,
Familia = x.Key.Familia,
Peca = x.Key.Peca
},
Servicos = x.Select(y => new ProdutoServico
{
CodigoServico = y.CodigoServico,
Hash = y.Hash,
Servico = y.Servico,
Valor = y.Valor
}).ToList()
});
これを達成するためのよりよい方法がありますか、それともそれが得られるほど良いですか? ProductoComparer
がある
var productsNormalized = productoSSOs
.Aggregate(new Dictionary<Produto,List<ProdutoServico>>(ProductoComparer),
(p,c) => {
var product = new Produto
{
CodigoPeca = c.CodigoPeca,
CodigoFamilia = c.CodigoFamilia,
Familia = c.Familia,
Peca = c.Peca
};
var service = new ProdutoServico
{
CodigoServico = c.CodigoServico,
Hash = c.Hash,
Servico = c.Servico,
Valor = c.Valor
};
if (!p.ContainsKey(product))
{
p[product] = new List<ProductoServico>() { service };
}
else
{
p[product].Add(service);
}
return p;
});
がIEqualityComparer<Producto>
(あるいはあなたがEquals
を実装することができます:あなたはこのような何かを行うことができ集計を使用して
コード取得にはどのくらいの時間がかかりますか?あなたはどれくらいそれを取るべきですか? – mjwills
* 'すべてのサービスを1つだけ取得する' * - あなたはすべてのグループとすべてのサービスを利用しているようです。フィルタリングはなく、 'Take(1)'や 'First()'のようなものはありません。 –
@SergeyBerezovskiy問題はサービスです。それはすべての製品のリストを返します。私は私の側でこれをしなければならない – Terkhos