0

我有一个场景,我们正在保存登录安全的问题和答案列表。在保存答案之前,我们正在做一个单向哈希以确保安全。现在我必须添加功能来接受对这个问题和答案列表的更新。我将收到一个列表,其中包含一个列表,该列表包含一个 questionid 和答案。这个新列表将是未散列的,我需要创建一个最终列表,其中包含未更改的问题和答案以及更新的问题和答案。

因此,我正在寻找一种优雅的方式来比较两个列表并使用合并的结果创建第三个列表。

例子:

原名单:

  “安全答案”:[{
      “问题”:1,
      “答案”:“dfkldlfndajfdkghfkjbgakljdn”
    }, {
      “问题2,
      “answerHash”:“ndlknfqeknrkefkndkjsfndskl”
    }, {
      “问题”:5,
      “answerHash”:“ieruieluiirhoeiurhoieubn”
    }]

更新列表:

  “安全答案”:[{
      “问题”:4,
      "answer" : "对问题 4 的回答"
    }, {
      “问题2,
      “答案哈希”:“”
    }, {
      “问题”:5,
      "answerHash" : "问题 5 的新答案"
    }]

合并名单:


  “安全答案”:[{
      “问题”:4,
      "answer" : "对问题 4 的回答"
    }, {
      “问题2,
      “answerHash”:“ndlknfqeknrkefkndkjsfndskl”
    }, {
      “问题”:5,
      "answerHash" : "问题 5 的新答案"
    }]

下一个问题将是散列新答案而不重新散列原始答案。但是,我相信我可以应付。我只是在寻找一种优雅的方式来进行合并。

谢谢。

4

1 回答 1

2

您可以使用 LINQ。Enumerable.Except返回设置的差异。因此,您需要创建一个自定义IEqualityComparer<Question>

public class QuestionComparer : IEqualityComparer<Question>
{
    public bool Equals(Question x, Question y)
    {
        return x.Question == y.Question; // assuming that it's a value type like ID (int)
    }

    public int GetHashCode(Question obj)
    {
        return obj.Question.GetHashCode();
    }
}

现在您可以使用比较器了:

var comparer = new QuestionComparer();
var newQuestions = UpdateList.Except(OriginalList, comparer).ToList();
var both = from o in OriginalList
           join u in UpdateList on o.Question equals u.Question
           select new { o, u };
var updatedQuestions = new List<Question>();
foreach(var x in both)
{
    // modify following accordingly, i take the updated question if the hash contains something, otherwise i use the original question
    if(x.u.AnswerHash != null && x.u.AnswerHash.Length != 0)
        updatedQuestions.Add(x.u);
    else
        updatedQuestions.Add(x.o);
}
于 2012-10-12T22:18:47.730 回答