C# 如何使用linq旋转此对象?

C# 如何使用linq旋转此对象?,c#,linq,C#,Linq,如果我有以下对象 public class CFS { public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public IList<Topic> Topics { get; set; } public IList<Status> Status { get; set;

如果我有以下对象

public class CFS
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public IList<Topic> Topics { get; set; }
    public IList<Status> Status { get; set; }
}

public class Topic
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Status
{
    public int ID { get; set; }
    public string Name { get; set; }
}
公共类CFS
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串电子邮件{get;set;}
公共IList主题{get;set;}
公共IList状态{get;set;}
}
公开课主题
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
公共阶级地位
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
如何将其放入Topic.ID==Status.ID&&Status.Name=“pass”的以下对象中?Topic和Status字符串值分别为Topic.Name和Status.Name值。字符串列表可以是名字、电子邮件等等,这部分很简单。我知道Topic和Status公开了相同的属性,但这只是这个例子

public class SelectedTopic
{
    public string Topic { get; set; }
    public string Status { get; set; }
    public IList<string> Person { get; set; }
}
public类SelectedTopic
{
公共字符串主题{get;set;}
公共字符串状态{get;set;}
公共IList Person{get;set;}
}

我尝试了SelectMany、Any和Join的多种组合,但我似乎无法按我所希望的方式透视数据。

我不知道您为什么要这样做,但以下是如何操作:

void Main()
{
  List<Topic> topicA = new List<Topic>() { new Topic() { ID = 1, Name = "1" }, new Topic() {ID = 2 , Name = "2"}, new Topic() {ID = 3, Name = "3" } };
  List<Topic> topicB = new List<Topic>() { new Topic() { ID = 2, Name = "2" }, new Topic() {ID = 3 , Name = "3"}, new Topic() {ID = 4, Name = "4" } };
  List<Topic> topicC = new List<Topic>() { new Topic() { ID = 1, Name = "1" } };
  List<Topic> topicD = new List<Topic>() { new Topic() {ID = 2 , Name = "2"}, new Topic() {ID = 3, Name = "3" } };

  List<Status> statusA = new List<Status>() { new Status() { ID = 1, Name = "pass" }, new Status() {ID = 2 , Name = "2"}, new Status() {ID = 3, Name = "3" } };
  List<Status> statusB = new List<Status>() { new Status() { ID = 2, Name = "2" }, new Status() {ID = 3 , Name = "pass"}, new Status() {ID = 4, Name = "pass" } };
  List<Status> statusC = new List<Status>() { new Status() { ID = 1, Name = "pass" } };
  List<Status> statusD = new List<Status>() { new Status() {ID = 2 , Name = "2"}, new Status() {ID = 3, Name = "pass" } };


  List<CFS> test = new List<CFS>() { 
                      new CFS() { FirstName = "A", LastName = "A", Email = "A@A.com", Topics = topicA, Status = statusA },
                      new CFS() { FirstName = "B", LastName = "B", Email = "B@B.com", Topics = topicB, Status = statusB },
                      new CFS() { FirstName = "C", LastName = "C", Email = "C@C.com", Topics = topicC, Status = statusC },
                      new CFS() { FirstName = "D", LastName = "D", Email = "D@D.com", Topics = topicD, Status = statusD },
  };


  var result = test.SelectMany(x => x.Topics.SelectMany((t) => x.Status, (topic,status) => new { CFS = x, T = topic, S = status }))
                    .Where(x => x.S.Name == "pass" &&  x.T.ID == x.S.ID)
                    .Select(x => new {  first = x.CFS.FirstName, status = x.S.Name, topic = x.T.Name})
                    .GroupBy(x => x.topic)
                    .Select(x => new SelectedTopic { Topic = x.Key, Status = "pass", Person = x.Select(z => z.first).Distinct().ToList() })
                    .Dump();

}
void Main()
{
List topicA=new List(){new Topic(){ID=1,Name=“1”},new Topic(){ID=2,Name=“2”},new Topic(){ID=3,Name=“3”};
List topicB=new List(){new Topic(){ID=2,Name=“2”},new Topic(){ID=3,Name=“3”},new Topic(){ID=4,Name=“4”};
List topicC=new List(){new Topic(){ID=1,Name=“1”};
List topicD=new List(){new Topic(){ID=2,Name=“2”},new Topic(){ID=3,Name=“3”};
列表状态a=new List(){new Status(){ID=1,Name=“pass”},new Status(){ID=2,Name=“2”},new Status(){ID=3,Name=“3”};
列表状态b=new List(){new Status(){ID=2,Name=“2”},new Status(){ID=3,Name=“pass”},new Status(){ID=4,Name=“pass”};
List Status c=new List(){new Status(){ID=1,Name=“pass”};
列表状态d=new List(){new Status(){ID=2,Name=“2”},new Status(){ID=3,Name=“pass”};
列表测试=新列表(){
新建CFS(){FirstName=“A”,LastName=“A”,Email=”A@A.com,Topics=topicA,Status=statusA},
新建CFS(){FirstName=“B”,LastName=“B”,Email=”B@B.com,Topics=topicB,Status=statusB},
新建CFS(){FirstName=“C”,LastName=“C”,Email=”C@C.com,Topics=topicC,Status=statusC},
新建CFS(){FirstName=“D”,LastName=“D”,Email=”D@D.com,Topics=topicD,Status=statusD},
};
var result=test.SelectMany(x=>x.Topics.SelectMany((t)=>x.Status,(topic,Status)=>new{CFS=x,t=topic,S=Status}))
其中(x=>x.S.Name==“通过”&&x.T.ID==x.S.ID)
.Select(x=>new{first=x.CFS.FirstName,status=x.S.Name,topic=x.T.Name})
.GroupBy(x=>x.topic)
.Select(x=>newselectedtopic{Topic=x.Key,Status=“pass”,Person=x.Select(z=>z.first).Distinct().ToList()})
.Dump();
}

在LinqPad中测试——如果您不使用此工具,我建议您这样做。

我不明白,每个用户都有一个主题列表和一个不连贯的状态列表。您想找到具有相同id值的所有主题和状态项,然后将它们添加到您的列表中,或者将用户附加到现有的列表中?您能否澄清一下您想要实现的目标?展示一些所需数据转换的示例,以及您实现它的尝试。谢谢。我知道这是个奇怪的模型。我基本上有一个用户数据列表,其中包含用户申请的项目,以及其他人对一个或多个应用程序的评分。然后,我被要求查看每个应用程序中符合特定评分标准的applied for项目和用户。我用嵌套循环和从原始对象中抽象列表来完成它,但我很好奇如何用我得到的数据模型来完成它。如果有另一层嵌套,语法会是什么样子?假设还有另一个嵌套键值对列表也有匹配的ID(键),只需使用zip添加它