繁体   English   中英

LINQ GroupBy返回List作为结果

[英]LINQ GroupBy return List as result

我有一个包含Transaction对象的List。 我要做的是找到所述List中具有相同transaction.Buyer.UserID的事务,并将它们组合成一个列表列表。

每个Sub-List项将包含多个事务对象,其中transaction.Buyer.UserID是相同的。

到目前为止我所拥有的是:

            var _ordersToCombine = 
            _transactions.GroupBy(transaction => transaction.Buyer.UserID).Select(transaction => transaction);

我进来的是:

List<Transaction>:
    Transaction { Buyer.UserID = "User1" ...}
    Transaction { Buyer.UserID = "User2" ...}
    Transaction { Buyer.UserID = "User1" ...}
    Transaction { Buyer.UserID = "User3" ...}
    Transaction { Buyer.UserID = "User4" ...}
    Transaction { Buyer.UserID = "User3" ...}

我期望它返回的是:

List<List<Transaction>>:
    List<Transaction>:
        Transaction { Buyer.UserID = "User1" ...}
        Transaction { Buyer.UserID = "User1" ...}
    List<Transaction>:
        Transaction { Buyer.UserID = "User3" ...}
        Transaction { Buyer.UserID = "User3" ...}

...并且还从主列表中删除这些事务,因此在此示例中,主列表将如下所示:

List<Transaction>:
    Transaction { Buyer.UserID = "User2" ...}
    Transaction { Buyer.UserID = "User4" ...}

Linq对我来说是一个全新的概念,我试图让自己理解。

只需使用它进行分组:

var results = transactions
.GroupBy(p => p.Buyer.UserID)
.Where(x=>x.Count()>1)
.Select(x=> new List<Transaction>(x));

这应该使用主列表中的重复用户生成List<List<Transaction> 在迭代它时,LINQ不是修改集合的正确工具。 如果你真的需要它,做:

var results = transactions.ToList()
.GroupBy(p => p.Buyer.UserID)
.Where(x=>x.Count()>1)
.Select(x=> 
{
    foreach(var item in x)
        transactions.Remove(item);
    return new List<Transaction>(x);
});

请注意,事务列表的副本用于执行查询( transactions.ToList()并在原始列表上执行删除操作。希望有帮助。

尝试这个 :

var dic = _transactions.GroupBy(t => t.Buyer.UserID).ToDictionary(t => t.Key, t => t.ToList());

GroupBy返回一个

IEnumerable<IGrouping<TKey, TSource>>

每个IGrouping <>包含Key,组标准,每个IGrouping都是可枚举的(列出分组值)

因为,问题改变了:

不要在GroupBy委托中创建匿名类型(没有新的{...})而是直接定位属性(因为在内部,GroupBy使用相等来分组事物,并且因为你创建了一个新的匿名对象,所以没有任何分组,因为每个新对象是不同的对象)

.GroupBy(o => o.Buyer.UserID, o.ToList) 

此外,

Select(p => p) 

什么都不做,这是一个身份功能。 没用的。

如果您想要的是列表列表,我认为您可以直接使用词典。 (请参阅我的答案的第一部分)您可以按照枚举List的相同方式枚举字典。 并在其中添加/删除/替换项目。

返回的Dictionary将是以下类型:

Dictionary<int,List<Transactions>> dic =....

使用Key = UserId,以及每个键,一个事务列表。 而且,它实际上比列表列表更快,因为您可以直接访问事务:

int userId = 42;
List<Transactions> transactions = dic[userId];

在LINQ分组

这可以回答您的查询。

var results = transactions.GroupBy(p => p.Buyer.UserID,
                         (key, g) => new { UserID = key, Cars = g.ToList() });

如果我理解正确,

您有一个事务列表和一个列表的事务列表。

您需要通过userId对后者进行分组,其中值将是与该用户对应的事务。

如果是这样的话,我准备了一个可能有用的小样本。

祝好运

public class Transaction
{
    public Buyer Buyer { get; set; }
}

public class Buyer
{
    public int UserID { get; set; }
}


[TestMethod]
public void Test()
{

    var t1 = new Transaction { Buyer = new Buyer { UserID = 1 } };
    var t2 = new Transaction { Buyer = new Buyer { UserID = 2 } };
    var t3 = new Transaction { Buyer = new Buyer { UserID = 3 } };
    var t4 = new Transaction { Buyer = new Buyer { UserID = 1 } };
    var t5 = new Transaction { Buyer = new Buyer { UserID = 3 } };

    var tList1 = new List<Transaction> { t1, t2, t3 };
    var tList2 = new List<Transaction> { t4, t5 };

    var tLists = new List<List<Transaction>> { tList1 , tList2};

    var result = tLists.
        SelectMany(o => o).
        GroupBy(o =>  new 
        {
            UserId = o.Buyer.UserID
        },
        (key, items) => new
        {
            UserId = key.UserId,
            Transactions = items.Select(p => p).ToList()
        }).
        ToList();
}

这是作者编辑的更新解决方案:

    var transactions = new List<Transaction>
    {
        new Transaction { Buyer = new Buyer { UserID = 1 } },
        new Transaction { Buyer = new Buyer { UserID = 2 } },
        new Transaction { Buyer = new Buyer { UserID = 3 } },
        new Transaction { Buyer = new Buyer { UserID = 1 } },
        new Transaction { Buyer = new Buyer { UserID = 3 } }
    };

    var result = transactions.
        Select(o => o).
        GroupBy(o => new
        {
            UserId = o.Buyer.UserID
        },
        (key, items) => new
        {
            //UserId = key.UserId,
            Transactions = items.Select(p => p).ToList()
        }).
        ToList();

不,你得到一个IEnumerable<IGrouping<TKey, TSource>>参见: MSDN Group By

所以基本上它返回一个组列表。 该组包含分组的键和元素,该元素是属于该组的项目列表

名单

  • 第1组
    • 组密钥
    • 项目(对象列表)
  • 第2组
    • 组密钥
    • 项目(对象列表)

很好的解释: https//www.udemy.com/blog/linq-group-by/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM