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()
});