无法使用两个列表中的项目创建第三个列表

时间:2018-07-19 09:04:28

标签: c# for-loop foreach

我正在尝试使用两个列表(客户和产品)的组合值将一个列表(我们称为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;

但是,执行此操作后,finalList仅将Jerry用作所有四个项目的客户。我也尝试使用foreach获得相同的结果。我不太确定自己在这里做错了什么,我很尴尬,这对某些人来说似乎很基础,所以我希望能有新的眼光发现我在这里犯了什么错误...

还有,我有什么办法可以进一步优化它?

一如既往,任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

这里:

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

您实际上并没有复制当前产品,而是从productsList复制了对商品的引用,并且在每个内循环迭代中,您都覆盖了同一productsList[j]元素中的属性。

您可能想了解有关赋值如何作用于引用类型的更多信息:
https://www.microsoftpressstore.com/articles/article.aspx?p=2454676

如果要制作两个列表的叉积,则需要创建一个新对象:

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;

对我来说,您在CustCode中拥有CustNameCustBranchIdProductDetailDto之类的属性令人困惑。这些属性仅对productsList中的对象为空吗?考虑专门为满足这些需求而创建另一个类,例如CustomerProductDto,以使您的意图变得更加清晰。

您可以使用LINQ对此进行优化:

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();

答案 1 :(得分:2)

这行代码:

singleDetail = productsList[j];

不影响值,而是影响指针,因此最后您将拥有同一指针的列表,因此仅重复了customerList.Count()

因此,您必须像customerList

一一添加值