gpt4 book ai didi

c# - 将 2 个列表合并到一个新列表中,该列表包含列表 1 和列表 2 中的数据 - 其中唯一键为 "VariantId"

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:06 25 4
gpt4 key购买 nike

我有两个数据列表(它们使用相同的类“SaleNumber”)。

每个列表都包含一个销售编号列表。第一个列表取自丹麦“DK”数据库,另一个来自瑞典数据库。

现在我正在遍历丹麦列表对于我循环遍历的每个项目,我在瑞典列表中找到具有相同变体 ID 的项目,然后我将数据加入一个名为 saleNumbers 的新列表。

问题在于,因为我循环遍历了丹麦语列表,所以如果丹麦语列表没有该变体 ID 的销售编号,那么它就不会循环遍历该变体。如果发生这种情况,那么也不会添加瑞典语列表项 - 因此不会创建 salenumbers 项目 - 即使它应该 - 它应该在 salenumbers.totalsalesDK 中有一个 0 和 salenumbers.totalsalesSE 的实际销售编号。

如何在不遗漏任何变体的情况下将两者合并为 salesnumbers?

我仍然希望保留结构 - 例如,我有 SaleNumbers.TotalSales 显示 dk 和 se 的总销售额。 SaleNumbers.TotalSalesDK 显示 DK 销售额,SaleNumbers.TotalSalesSE 显示该商品的 SE 销售额。主唯一键始终是 variantId。这是我当前的代码:

    private List<SaleNumber> ConvertDataTableToSaleNumbers(DataTable dt)
{
List<SaleNumber> saleNumbers = new List<SaleNumber>();
foreach (DataRow dr in dt.Rows)
{
saleNumbers.Add(new SaleNumber() { ProductId = int.Parse(dr["productid"].ToString()), TotalSales = int.Parse(dr["totalsales"].ToString()), VariantId = int.Parse(dr["variantid"].ToString()) });
}
return saleNumbers;
}

DataTable dtDK = new Shoply.Data.DLOrderDetail().GetNumberOfSalesSinceOrderId(constDaysAgo,
Shoply.Data.DLBasis.GetTheConnectionToTheLanguage("dk"));
DataTable dtSE = new Shoply.Data.DLOrderDetail().GetNumberOfSalesSinceOrderId(constDaysAgo,
Shoply.Data.DLBasis.GetTheConnectionToTheLanguage("se"));

List<SaleNumber> saleNumbersDK = ConvertDataTableToSaleNumbers(dtDK);
List<SaleNumber> saleNumbersSE = ConvertDataTableToSaleNumbers(dtSE);

var saleNumbers = saleNumbersDK.SelectMany
(
foo => saleNumbersSE.Where(bar => foo.VariantId == bar.VariantId).DefaultIfEmpty(),
(foo, bar) => new SaleNumber
{
VariantId = foo.VariantId,
ProductId = foo.ProductId,
TotalSales = foo.TotalSales + (bar == null ? 0 : bar.TotalSales),
TotalSalesDK = foo.TotalSales,
TotalSalesSE = (bar == null ? 0 : bar.TotalSales)
}
);

最佳答案

编辑:更新代码以执行外连接


如何使用 Join在 Linq 中。

可以在这里看到简单的 dotnetfiddle:Dotnetfiddle link

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
public static void Main(string[] args)
{
List<SaleNumber> saleNumbersDK = new List<SaleNumber> {
new SaleNumber() { VariantId="a",ProductId="A",TotalSales=10 },
new SaleNumber() { VariantId="b",ProductId="B",TotalSales=20 }

};
List<SaleNumber> saleNumbersSE = new List<SaleNumber> {
new SaleNumber() { VariantId="a",ProductId="A",TotalSales=10 },
new SaleNumber() { VariantId="c",ProductId="c",TotalSales=30 }

};

var innerjoin = saleNumbersDK.Join(saleNumbersSE, d => d.VariantId, s => s.VariantId, (d, s) =>
{
return new SaleNumber()
{
VariantId = d.VariantId,
ProductId = d.ProductId,
TotalSales = d.TotalSales+ (s == null ? 0 : s.TotalSales),
TotalSalesDK = d.TotalSales,
TotalSalesSE = (d == null ? 0 : d.TotalSales)
};
});
var pendingright= saleNumbersSE.Except(innerjoin, new CustomComparer());
var pendingleft = saleNumbersDK.Except(innerjoin, new CustomComparer());
var salesNumber= innerjoin.Concat(pendingright).Concat(pendingleft);
foreach (var sale in salesNumber)
{
Console.WriteLine(sale);
}
//Console.ReadLine();
}


}
public class SaleNumber
{
public string VariantId { get; set; }
public string ProductId { get; set; }
public int TotalSales { get; set; }
public int TotalSalesDK { get; set; }
public int TotalSalesSE { get; set; }

public override string ToString()
{
return VariantId+"-"+ProductId+"-"+TotalSales+"-"+TotalSalesDK+"-"+TotalSalesSE;
}
}

public class CustomComparer : IEqualityComparer<SaleNumber>
{
public bool Equals(SaleNumber x, SaleNumber y)
{
return x.VariantId == y.VariantId;
}
public int GetHashCode(SaleNumber obj)
{
return obj.VariantId.GetHashCode();
}
}

关于c# - 将 2 个列表合并到一个新列表中,该列表包含列表 1 和列表 2 中的数据 - 其中唯一键为 "VariantId",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59197813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com