我正在尝试使用两个列表(客户和产品)的组合值将一个列表(我们称为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
获得相同的结果。我不太确定自己在这里做错了什么,我很尴尬,这对某些人来说似乎很基础,所以我希望能有新的眼光发现我在这里犯了什么错误...
还有,我有什么办法可以进一步优化它?
一如既往,任何帮助将不胜感激。谢谢。
答案 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
中拥有CustName
,CustBranchId
和ProductDetailDto
之类的属性令人困惑。这些属性仅对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