C# 使用两个列表中的项目创建第三个列表时出现问题

C# 使用两个列表中的项目创建第三个列表时出现问题,c#,for-loop,foreach,C#,For Loop,Foreach,我试图使用两个列表的组合值来组合一个列表(我们称之为FinalList):客户和产品。假设我们有四个客户和一个产品,FinalList应该有四个项目的最终结果(每个客户一个) 例如: Customer List: Customer Code | Customer Name | Customer Branch ID ------------------|-----------------------|------------------------ 001

我试图使用两个列表的组合值来组合一个列表(我们称之为FinalList):客户和产品。假设我们有四个客户和一个产品,FinalList应该有四个项目的最终结果(每个客户一个)

例如:

Customer List:
Customer Code     |     Customer Name     |  Customer Branch ID
------------------|-----------------------|------------------------
001               |      Tom              |      T001                 
002               |      Dick             |      T002                 
003               |      Harry            |      T003                 
004               |      Jerry            |      T004                 


Product List:
Product Code      |    Product Name     
------------------|---------------------
  P001            |   Apple             
目前我正尝试这样做:

var finalList = new List<ProductDetailDto>();
var customerList = new List<CustomerGroup>();

/// productsList is also type List<ProductDetailDto>();

for (var j = 0; j<= productsList.Count()-1; j++)
{
    for (int i = 0; i <= customerList.Count() - 1; i++)
    {
        var singleDetail = new ProductDetailDto();

        // Copy current products to groupDetail
        singleDetail = productsList[j];

        // Assemble rest of the info
        singleDetail.CustCode = customerList[i].Customer.CustomerCode;
        singleDetail.CustName = customerList[i].Customer.CustomerName;
        singleDetail.CustBranchId = customerList[i].Customer.CustomerBranchId;

        finalList.Add(singleDetail);
    }
}

return finalList;
var finalList=new List();
var customerList=新列表();
///productsList也是类型List();
对于(var j=0;j此处:

实际上,您并不复制当前产品,而是从productsList复制对项目的引用,并且在每次内部循环迭代中,您都会覆盖同一
productsList[j]
元素中的属性

您可能想阅读更多关于赋值如何在引用类型上工作的内容:

如果要对两个列表进行叉积,则需要创建一个新对象:

var finalList = new List<ProductDetailDto>();
var customerList = new List<CustomerGroup>();

/// productsList is also type List<ProductDetailDto>();

for (var j = 0; j<= productsList.Count()-1; j++)
{
    for (int i = 0; i <= customerList.Count() - 1; i++)
    {
        var singleDetail = new ProductDetailDto 
        {
            ProductCode = productsList[j].ProductCode,
            ProductName = productsList[j].ProductName
            // and whatever other properties your product have
        };

        // Assemble rest of the info (these can actually go to object initializer too)
        singleDetail.CustCode = customerList[i].Customer.CustomerCode;
        singleDetail.CustName = customerList[i].Customer.CustomerName;
        singleDetail.CustBranchId = customerList[i].Customer.CustomerBranchId;

        finalList.Add(singleDetail);
    }
}

return finalList;
这行代码:

singleDetail = productsList[j];
影响一个指针而不是值,因此最后会有一个相同指针的列表,这样就只会重复最后一次修改
customerList.Count()


因此,您必须像
customerList

那样逐个添加值,谢谢您的简明解释!这解决了我的问题。我误解了
singleDetail=productsList[j]
认为它将按原样复制每个迭代…肯定会阅读您提供的参考。谢谢!回答您的问题:其他属性,它们的值是在以前的函数中提供的,为了简洁起见,我没有在问题中包括这些属性。:)
var items = from p in productsList
            from c in customerList
            select new ProductDetailDto
            {
                ProductCode = p.ProductCode,
                ProductName = p.ProductName
                CustCode = c.Customer.CustomerCode,
                CustName = c.Customer.CustomerName,
                CustBranchId = c.Customer.CustomerBranchId,
            };
return items.ToArray();
singleDetail = productsList[j];