0

ログインセキュリティのために質問と回答のリストを保存するシナリオがあります。回答を保存する前に、セキュリティのために一方向のハッシュを実行しています。次に、この質問と回答のリストの更新を受け入れる機能を広告する必要があります。質問IDと回答を含むリストを含むリストを受け取ります。この新しいリストはハッシュ化されないため、変更されていない質問と回答、および更新されたものを含む最終的なリストを作成する必要があります。

したがって、2つのリストを比較し、マージされた結果で3番目のリストを作成するエレガントな方法を探しています。

例:

元のリスト:

  "securityAnswers":[{
      "質問1、
      "回答": "dfkldlfndajfdkghfkjbgakljdn"
    }、{
      "質問2、
      "answerHash": "ndlknfqeknrkefkndkjsfndskl"
    }、{
      「質問」:5、
      "answerHash": "ieruieluirhoeiurhoieubn"
    }]

更新リスト:

  "securityAnswers":[{
      「質問」:4、
      "回答":"質問4への回答"
    }、{
      "質問2、
      "answerHash": ""
    }、{
      「質問」:5、
      "answerHash":"質問5の新しい回答"
    }]

マージされたリスト:


  "securityAnswers":[{
      「質問」:4、
      "回答":"質問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 に答える