Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用迭代进行分组?_C#_Linq - Fatal编程技术网

C# 如何使用迭代进行分组?

C# 如何使用迭代进行分组?,c#,linq,C#,Linq,我正在尝试按板对JSON进行分组,并对likes_计数求和,但不确定如何实现这一点,因为我只能通过先循环根来访问事务类 public class Transaction { public string Post { get; set; } public int board {get; set; } public int Sent_from { get; set; } public int likes_count { get; set; } } publi

我正在尝试按板对JSON进行分组,并对likes_计数求和,但不确定如何实现这一点,因为我只能通过先循环根来访问事务类

    public class Transaction
{
    public string Post { get; set; }
    public int board {get; set; }
    public int Sent_from { get; set; }
    public int likes_count { get; set; }
}

public class Root
{
    public int Sent_to { get; set; }
    public List<Transaction> Transactions { get; set; }

}

static async System.Threading.Tasks.Task Main(string[] args)
{


    var json = "";      
    using (WebClient wc = new WebClient())
    {
        json = wc.DownloadString("xxxxxxx");
    }
    var obj = JsonConvert.DeserializeObject<List<Root>>(json);

    foreach (var item in obj)
    {

        foreach (var child in item.Transactions)
        {
            
            // access sent_from, likes_count and post.

        }

    }
}
以下是一个JSON示例:

Sent_to: X,
total_received_likes: X,
Transactions: [
{
Post: "50776785",
board: "600",
Sent_from: 359716,
likes_count: 4,
},
{
Post: "5085129785",
board: "500",
Sent_from: 359716,
likes_count: 6,
},
{

Post: "506542785",
board: "500",
Sent_from: 359716,
likes_count: 9,
},
这种情况下的预期输出:

500人中有15人喜欢

600板中有4个喜欢


如果您想按
board
对交易进行分组,而不管它们属于哪个
Root
,然后计算每个组的
likes\u count
之和,您可以使用以下方法创建一个列表:

var list = obj.SelectMany(r => r.Transactions)
              .GroupBy(t => t.board)
              .Select(g => new { Board = g.Key, TotalLikes = g.Sum(t => t.likes_count) })
              .ToList();
foreach (var item in list)
{
    Console.WriteLine($"{item.TotalLikes} like(s) in board {item.Board}.");
}
…然后您可以这样使用:

var list = obj.SelectMany(r => r.Transactions)
              .GroupBy(t => t.board)
              .Select(g => new { Board = g.Key, TotalLikes = g.Sum(t => t.likes_count) })
              .ToList();
foreach (var item in list)
{
    Console.WriteLine($"{item.TotalLikes} like(s) in board {item.Board}.");
}
如果愿意,您还可以分别对每个
执行相同的操作:

foreach (var root in obj)
{
    var list = root.Transactions
                   .GroupBy(t => t.board)
                   .Select(g => new { Board = g.Key, TotalLikes = g.Sum(t => t.likes_count) })
                   .ToList();
}

我不太明白。根据
喜欢的次数之和对
进行分组是可以理解的,但是如果
Post
对于
交易的每个项目都可能不同,您希望如何根据
Post
进行分组?您能否提供示例数据和预期的输出?分组后您能否共享json和输出json的预期结果。您能否尝试以下var query=obj.transactions.GroupBy(x=>new{x.Column1,Sum(x.Column2)})@AhmedAbdelhameed我的意思是“董事会”而不是职位,我道歉。编辑并添加了示例JSON以及预期的输出。@Sajid已添加。谢天谢地!谢谢:)作为一个附带问题,有什么好的LINQ教程,或者你会推荐的课程吗?@CSharpdocsz所有的东西都解释得很好。你可以一篇接一篇地开始和跟随文章。还有一些简化的教程,例如,它提供了如何使用每种方法的基本示例。