c# - 如何使用 LINQ 将共享 1 个属性的两个列表合并为第三个列表?

标签 c# linq list

我希望创建以下类(列表)的列表:

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/

相关文章:

c# - 如果路径包含 "#",则 System.Uri 无法提供正确的 AbsolutePath 和 LocalPath

c# - System.Console 解析为不正确的命名空间

vb.net - 在 LINQ 中合并 2 个列表

Java - 链接列表泛型子列表

c# - 运行 Fixtures 但不是并行 NUnit 中的方法

asp.net - Visual Studio 2005 上的 Linq

Linq 获取列表(父级)中的元素,其中子列表中对象的属性满足条件?

python - 将列表列表转换为 float ,同时忽略字符串列

java - 程序以按插入频率排序的方式打印字符串

c# - 通过调用函数中的异常离开当前函数