我希望创建以下类(列表)的列表:
public class StatusData
{
public DateTime? Date { get; set; }
public int RegisteredUsers { get; set; }
public int Orders { get; set; }
public decimal Import { get; set; }
}
此列表应填充另外 2 个列表的信息:a List<Contact>
和一个 List<Purchase>
.这两个类都具有以下形状:
public class Contact
{
public DateTime? RegisterDate { get; set; }
public string Name { get; set; }
}
public class Purchase
{
public DateTime? PurchaseDate { get; set; }
public int PurchaseID {get;set;}
public int Import { get; set; }
}
这个想法是,列表应该是每天的注册用户数量、购买数量和这些购买的总进口量。所以,本质上,两者只是共享日期。
但是,我无法使用良好的 LINQ 表达式来创建列表。我考虑的一种解决方案是检索 2 个列表中所有不同的日期,然后遍历它们以检索我想要的信息,但我认为这种方法相当“丑陋”。有什么方法可以轻松完成我想做的事情吗?
编辑:我想要的示例如下:
Contacts
--------
Name RegisteredDate
David 10/10/2013
Paul 09/10/2013
Gina 10/10/2013
Roger 09/10/2013
Rose 05/10/2013
Jean 07/10/2013
Mark 04/10/2013
Lisa 04/10/2013
Purchases
-----------
ID PurchaseDate Import
1 10/10/2013 10
2 10/10/2013 10
3 10/10/2013 20
4 04/10/2013 15
5 04/10/2013 15
6 07/10/2013 20
7 07/10/2013 2
8 07/10/2013 2
Expected result
----------------
Date RegisteredUsers Purchases Import
04/10/2013 2 2 30
05/10/2013 1 0 0
07/10/2013 1 3 24
09/10/2013 2 0 0
10/10/2013 2 3 40
亲切的问候
最佳答案
var contacts = new List<Contact>();
var purchases = new List<Purchase>();
var dates = contacts.Select(x => x.RegisterDate.Value)
.Concat(purchases.Select(x => x.PurchaseDate.Value))
.Distinct();
var data = from date in dates
join c in contacts on date equals c.RegisterDate.Value into registered
join p in purchases on date equals p.PurchaseDate.Value into purchased
select new StatusData {
Date = date,
RegisteredUsers = registered.Count(),
Orders = purchases.Count(),
Import = purchases.Sum(x => x.Import)
};
当至少进行了一次注册或一次购买时,它将返回所有天的StatusData
。
关于c# - 如何使用 LINQ 将共享 1 个属性的两个列表合并为第三个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22460296/