Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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_Group By - Fatal编程技术网

C# 根据同一对象列表中的元素对其进行分组

C# 根据同一对象列表中的元素对其进行分组,c#,linq,group-by,C#,Linq,Group By,我有以下类型的对象列表Application,如下所示: public class Application { public int AppId { get; set; } public List<Question> Questions { get; set; } } 根据以下规则对它们进行分组:将所有相同的问题收集到包含这些问题的APPID列表下。示例性输入和输出: Input: A1(Q1,Q2,Q3), A2(Q1,Q2), A

我有以下类型的对象列表
Application
,如下所示:

public class Application
    {
        public int AppId { get; set; }
        public List<Question> Questions { get; set; }
    }
根据以下规则对它们进行分组:将所有相同的问题收集到包含这些问题的APPID列表下。示例性输入和输出:

Input: A1(Q1,Q2,Q3), A2(Q1,Q2), A3(Q1,Q3), A4(Q1). 
Output: A1,A2,A3,A4(Q1), A1,A2(Q2), A1,A3(Q3)

在林克可以这样做吗?或者我必须自己写逻辑?

我认为这个问题描述得有点离题。每个应用程序都应该有一个不同的
AppId
,因此本质上没有任何分组依据,因为所有
AppId
都是不同的。相反,我们应该按问题分组,因为每个应用程序可能都有相同的问题

以下是我所拥有的(就样式而言,它与确切的输出不匹配,因为您的示例输出基于
AppId
的分组,而不是问题,但预期结果是相同的):


  • 应用程序1、2、3、4都包含问题1

  • 应用程序1、2包含问题2

  • 申请1、3包含问题3



请让我知道这是否有帮助。我也为您创建了一个查询,供您自己测试并给我反馈。

也许有一个更简单的方法,但这是我编写的第一个
LINQ
查询,至少应该足以让您开始。首先,我将您的问题和AppID展平,然后按问题重新分组,并按问题列出您的AppID。请注意,您必须先填充应用程序的
列表
,然后才能运行

List<Application> app = new List<Application>();
var output = (from a in app.SelectMany(p => p.Questions.Select(z => new {z, p.AppId})
group a.AppId by new 
{
a.Questions
} into combined
select new 
{
combined.Key.Questions,
combined.ToList()
});
List app=newlist();
var output=(来自应用程序内的SelectMany(p=>p.Questions.Select)(z=>new{z,p.AppId})
组a.AppId由新
{
a、 问题
}合并成
选择新的
{
组合关键问题,
合并的
});

你已经尝试过什么?什么具体不起作用?我只是不知道从哪里开始
A1(Q1,Q2)
A2(Q2,Q3)
A3(Q1,Q3)的预期结果是什么
?@Pawel通常你需要在这里展示一些尝试。如果你完全不知道如何开始,那么你至少需要给我们一个输入和输出示例。我们这里没有一个非常清晰的所需功能。@DmitryBychenko,它将是:A1,A3(Q1),A1,A2(Q2),A2,A3(Q3)好的,但现在基本上输出和输入是一样的。我想实现的是输出,就像你写的:
应用程序1,2,3,4都包含问题1,2包含问题2,应用程序1,3包含问题3。换句话说:
//1,2,3,4谁//1,2什么//1,3在哪里
,所以基本上你没有实现我想要什么,但我决定改变Section类的结构,使其只有一个问题——这样它就完成了它的工作(不过我将对您的代码进行一些小的更改,因为它没有编译,还添加了Section类)。谢谢!
using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {       
        // create Questions

        var questionOne = new Question(){QuestionId = 1, ActualQuestion = "Who"};
        var questionTwo = new Question(){QuestionId = 2, ActualQuestion = "What"};
        var questionThree = new Question(){QuestionId = 3, ActualQuestion = "Where"};

        // Assign questions to the specified list of questions

        var applicationOneQuestions = new List<Question>(){questionOne, questionTwo, questionThree};
        var applicationTwoQuestions = new List<Question>() {questionOne, questionTwo};
        var applicationThreeQuestions = new List<Question>() {questionOne, questionThree};
        var applicationFourQuestions = new List<Question>() {questionOne};

        // Create Applications

        var applicationOne = new Application(){AppId = 1, Questions = applicationOneQuestions};
        var applicationTwo = new Application(){AppId = 2, Questions = applicationTwoQuestions};
        var applicationThree = new Application() {AppId = 3, Questions = applicationThreeQuestions};
        var applicationFour = new Application() {AppId = 4, Questions = applicationFourQuestions};

        // Create List of Applications

        var lstApplications = new List<Application>(){applicationOne, applicationTwo, applicationThree, applicationFour};

        // Group Applications based on Questions and cast to Section Object

        var groupApplications = lstApplications.GroupBy(x => x.Questions).Select(t => new Section { AppIds = t.Select(z => z.AppId).ToList() , Questions = t.Key}).ToList();

        foreach(var item in groupApplications)
        {
            foreach(var appId in item.AppIds)
            {
                Console.WriteLine(appId);

            }

            foreach(var question in item.Questions)
            {
                Console.WriteLine(question.ActualQuestion);
            }

            Console.WriteLine("\n");
        }
    }
}

public class Application
    {
        public int AppId { get; set; }
        public List<Question> Questions { get; set; }
    }

public class Section
       {
            public List<int> AppIds { get; set; }
            public List<Question> Questions { get; set; }
        }

public class Question
{
    public int QuestionId {get;set;}
    public string ActualQuestion {get;set;} 
}
// 1
// Who
// What
// Where

// 2
// Who
// What

// 3
// Who
// Where

// 4
// Who
List<Application> app = new List<Application>();
var output = (from a in app.SelectMany(p => p.Questions.Select(z => new {z, p.AppId})
group a.AppId by new 
{
a.Questions
} into combined
select new 
{
combined.Key.Questions,
combined.ToList()
});