Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将两个列表合并到一个新列表中,该列表包含列表1和列表2中的数据-其中唯一键为;瓦里亚蒂;_C#_Asp.net_.net - Fatal编程技术网

C# 将两个列表合并到一个新列表中,该列表包含列表1和列表2中的数据-其中唯一键为;瓦里亚蒂;

C# 将两个列表合并到一个新列表中,该列表包含列表1和列表2中的数据-其中唯一键为;瓦里亚蒂;,c#,asp.net,.net,C#,Asp.net,.net,我有两个数据列表(它们使用同一个类“SaleNumber”) 每个列表都包含一个销售编号列表。第一份清单取自丹麦“DK”数据库,另一份取自瑞典数据库 现在,我在丹麦列表中循环我循环的每个项目,我在瑞典列表中找到了具有相同变体id的项目,然后我将数据加入到一个名为SaleNumber的新列表中 问题是,因为我循环了丹麦列表,所以如果丹麦列表没有该变量id的SaleNumber,那么它就不会循环这个变量。如果发生这种情况,瑞典列表项也不会被添加,因此salenumbers项不会被创建,即使它应该被创

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

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

现在,我在丹麦列表中循环我循环的每个项目,我在瑞典列表中找到了具有相同变体id的项目,然后我将数据加入到一个名为SaleNumber的新列表中

问题是,因为我循环了丹麦列表,所以如果丹麦列表没有该变量id的SaleNumber,那么它就不会循环这个变量。如果发生这种情况,瑞典列表项也不会被添加,因此salenumbers项不会被创建,即使它应该被创建,salenumbers.totalsalesDK中应该有一个0,salenumbers.totalsalesSE的实际salenumber

如何在不丢失任何变体的情况下将两者合并为销售编号

我仍然希望保留结构-例如,我有SaleNumber.TotalSales,显示dk和se的TotalSales之和。以及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)
              }
          );
私有列表转换DataTableToSalenNumber(DataTable dt)
{
List saleNumbers=新列表();
foreach(数据行dr在dt.行中)
{
添加(新saleNumbers(){ProductId=int.Parse(dr[“ProductId”].ToString()),TotalSales=int.Parse(dr[“TotalSales”].ToString()),VariantId=int.Parse(dr[“VariantId”].ToString());
}
返回销售编号;
}  
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 saleNumbersDK=将数据表转换为数字表(dtDK);
List saleNumbersSE=将数据表转换为销售编号(dtSE);
var saleNumbers=saleNumbersDK.SelectMany
(
foo=>saleNumbersSE.Where(bar=>foo.VariantId==bar.VariantId.DefaultIfEmpty(),
(foo,bar)=>新销售额
{
VariantId=foo.VariantId,
ProductId=foo.ProductId,
TotalSales=foo.TotalSales+(bar==null?0:bar.TotalSales),
TotalSalesDK=foo.TotalSales,
TotalSalese=(bar==null?0:bar.TotalSales)
}
);
您可以使用以下方法:

您可以使用以下方法:


假设DK和SE的ProductId相同,您可以使用像这样的groupby函数来获得所需的结果

testDK.ForEach(s => s.TotalSalesDK = s.TotalSales);
testSE.ForEach(s => s.TotalSalesSE = s.TotalSales);
testDK.Concat(testSE)
   .GroupBy(s => s.VariantId)
   .Select(g => new SaleNumber() { 
      VariantId = g.First().VariantId,
      ProductId=g.First().ProductId,
      TotalSales = g.Sum(s=>s.TotalSalesDK) + g.Sum(s=>s.TotalSalesSE),
      TotalSalesDK=g.Sum(s=>s.TotalSalesDK),
      TotalSalesSE=g.Sum(s=>s.TotalSalesSE)
   }).ToList()

假设DK和SE的ProductId相同,您可以使用像这样的groupby函数来获得所需的结果

testDK.ForEach(s => s.TotalSalesDK = s.TotalSales);
testSE.ForEach(s => s.TotalSalesSE = s.TotalSales);
testDK.Concat(testSE)
   .GroupBy(s => s.VariantId)
   .Select(g => new SaleNumber() { 
      VariantId = g.First().VariantId,
      ProductId=g.First().ProductId,
      TotalSales = g.Sum(s=>s.TotalSalesDK) + g.Sum(s=>s.TotalSalesSE),
      TotalSalesDK=g.Sum(s=>s.TotalSalesDK),
      TotalSalesSE=g.Sum(s=>s.TotalSalesSE)
   }).ToList()
编辑: 更新代码以执行外部连接


在Linq中使用如何

这里可以看到简单的dotnetfiddle:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main(字符串[]args)
{
List saleNumbersDK=新列表{
new SaleNumber(){VariantId=“a”,ProductId=“a”,TotalSales=10},
new SaleNumber(){VariantId=“b”,ProductId=“b”,TotalSales=20}
};
List saleNumbersSE=新列表{
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)=>
{
返回新的SaleNumber()
{
VariantId=d.VariantId,
ProductId=d.ProductId,
TotalSales=d.TotalSales+(s==null?0:s.TotalSales),
TotalSalesDK=d.TotalSales,
TotalSalesE=(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销售)
{
控制台。WriteLine(销售);
}
//Console.ReadLine();
}
}
公共类销售编号
{
公共字符串VariantId{get;set;}
公共字符串ProductId{get;set;}
公共整数TotalSales{get;set;}
公共整数TotalSalesDK{get;set;}
公共整数TotalSalesSE{get;set;}
公共重写字符串ToString()
{
返回VariantId+“-”+ProductId+“-”+TotalSales+“-”+TotalSalesDK+“-”+TotalSalesSE;
}
}
公共类CustomComparer:IEqualityComparer
{
公共布尔等于(SaleNumber x,SaleNumber y)
{
返回x.VariantId==y.VariantId;
}
public int GetHashCode(SaleNumber obj)
{
返回obj.VariantId.GetHashCode();
}
}
编辑: 更新代码以执行外部连接


在Linq中使用如何

这里可以看到简单的dotnetfiddle:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main(字符串[]args)
{
List saleNumbersDK=新列表{
new SaleNumber(){VariantId=“a”,ProductId=“a”,TotalSales=10},
new SaleNumber(){VariantId=“b”,ProductId=“b”,TotalSales=20}
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();           
        }
    }