C# 如何将两个对象中的字段合并为一个?

C# 如何将两个对象中的字段合并为一个?,c#,linq,C#,Linq,我有以下几点 public class AnswerDetail { public int AnswerId { get; set; } public string Text { get; set; } public Nullable<bool> Correct { get; set; } public Nullable<bool> Response { get; set; } } 公共类应答器详细信息 { public int Answ

我有以下几点

public class AnswerDetail
{
    public int AnswerId { get; set; }
    public string Text { get; set; }
    public Nullable<bool> Correct { get; set; }
    public Nullable<bool> Response { get; set; }
}
公共类应答器详细信息
{
public int AnswerId{get;set;}
公共字符串文本{get;set;}
公共可为空的正确{get;set;}
公共可空响应{get;set;}
}
  • 从客户那里,我收到了一份带有Response字段的AnswerDetail 填充:应答器详细信息rfc
  • 从数据库中,我收到了一个带有正确字段的AnwerDetail 回答:afd
我如何组合这些元素来创建另一个AnswerDetail对象,该对象从afd获取AnswerId、文本和更正,并从rfc获取响应


更新:删除了ClientAnswers类以简化问题

Maybee您可以尝试以下方法:

rfc.Select(r=>
    new AnswerDetail
    {
        AnswerId =r.AnswerId,
        Text=r.Text,
        Response=r.Response,
        Correct=afd.Single(c=>c.AnswerId==r.AnswerId).Correct
    }
           );
var combined = from rfcItem in rfc.Answers
               join afdItem in afd.Answers on rfcItem.AnswerId equals afdItem.AnswerId
               select new AnswerDetail 
               { 
                   AnswerId = afdItem.AnswerId,
                   Text = afdItem.Text,
                   Correct = afdItem.Correct,
                   Response = rfcItem.Response
               };

考虑到你已经有了来自客户端的
响应
字段,这实际上只是一个用数据库的正确答案更新结果的例子

foreach (var a in rfc)
{
    a.Correct = afd.Answers.Single(x => x.AnswerId == a.AnswerId).Select(x => x.Correct);
}

您需要创建一个新的
AnswerDetail
,然后只需从正确的源设置属性即可

AnswerDetail adCombined = new AnswerDetail
{
    AnswerId = afd.AnswerId,
    Text = afd.Text,
    Correct = afd.Correct,
    Response = rfc.Response
};

我认为每个afd都有相应的rfc答案:

var zipped = from rows in afd.Answers
             select new AnswerDetail()
             {
                AnswerId = rows.AnswerId,
                Correct = rows.Correct,
                Response = rfc.Answers.First(r=>r.AnswerId == rows.AnswerId).Response,
                Text = rows.Text
             };
您可以将整个ClientAnswer创建为:

var zipped = new ClientAnswers()
             {
                QuestionId = yourQuestionId, 
                Answers = (from rows in afd.Answers
                          select new AnswerDetail()
                          {
                              AnswerId = rows.AnswerId,
                              Correct = rows.Correct,
                              Response = rfc.Answers.First(r => r.AnswerId == rows.AnswerId).Response,
                              Text = rows.Text
                          }).ToList()
            };

你的信息并没有提到列表

为什么不:

afd.Response = rfc.Response;

这两个列表是如何链接的?相对于问题ID,afd和rfc的AsnwerId是否相同?是的,回答ID匹配。我刚刚删除了另一个包含类,因为它使问题复杂化了,我可以做那部分。offtopic但是:你知道你可以写bool吗?不是空的?@gsharp-谢谢,我应该也将要改变它。你不能创建一个新的对象并设置适当的字段吗?
Where(…)。Single()
应该是
Single(…)
。谢谢-你的答案是我认为第一个,所以我标记为正确。更多的答案我想标记为正确,但我只能标记一个正确,所以我比其他答案更正确。答案ID,文本和afd的正确性。它说。你使用了错误的变量,afd应该用于迭代,rfd用于单个语句我认为这里不需要投影,像我的回答中那样迭代和更新工作更少。实际上它们是单一的,因为OP已经编辑了question@trippino:不,它们以前是单个对象,但属于不同的tpye。不清楚单个
ClientAnswers
对象是否包含一个或多个
AnswerDetails
以及它们之间的关系。现在问题清楚了。OP想要创建一个包含回答细节的ICollection的ClientAnswer。OP编辑了这个问题,以简化问题。检查编辑历史记录。
afd.Response = rfc.Response;