0
public class Filter
{
    public int A { get; set; }
    public int B { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

Filter場合によっては 1 つのプロパティ、場合によってはすべてのプロパティに従って2 つのオブジェクトを比較する最良の方法は何ですか? 私が持っていることを意味し、使用されたフィルターと互換性のあるものDictionary<Filter, string>をすべて見つける必要があります。KeyValuePairs

var f1 = new Filter(){A = 1}
var f2 = new Filter(){A = 1, Start = DateTime.Now, End = DateTime.AddHour(2)}

var dict = new Dictionary<...>()
dict.Add(new Filter(){A = 1}, "asdf");
dict.Add(new Filter(){A = 1}, Start = DateTime.Now.AddHours(-1), "qwerty");

今、f1私は両方を見つけKeyValuePairsたいと思っていますが、2番目のオブジェクトでは条件を満たさないため、最初のKVPのみをf2見つけたいと思います+StartStartEndf2

EDIT Dictionary は、この質問の範囲外です。そうでなければなりません。比較のメカニズムだけが必要です。私はそれを行うために辞書を作成しません。私にとって重要なデータを保存するために必要です。

4

4 に答える 4

1

このようなものはどうですか:

    IEnumerable<KeyValuePair<Filter, string>> DoIt(Dictionary<Filter, string> dict, Filter f)
    {
        return dict.Where
            (d => 
                (f.A == null || d.Key.A == f.A) && 
                (f.B == null || d.Key.B == f.B) && 
                (f.Start == null || f.Start < d.Key.Start) /* && Condition for End */);
    }

条件はあなたが望んでいたものではないと思いますが、おそらくここから理解できるでしょう...

于 2012-07-23T13:44:29.037 に答える
0

複数の基準で比較する必要がある場合は、1つでDictionary<Filter, string>は不十分です。インスタンス化するときにカスタムIEqualityComparer<Filter>を指定できますが、定義できるのは単一の比較基準のみです。

辞書のポイントは、特定のキーによる高速ルックアップを可能にすることであり、キーを変更したい場合は、これを利用することはできません。

次のいずれかを実行できます。

  1. 使用する予定の基準ごとに新しいディクショナリインスタンスを作成し、適切なIEqualityComparer<Filter>実装に合格するか、または

  2. プレーンList<Tuple<Filter, string>>を使用してから、を使用してフィルタリングしIEnumerable.Whereます。

于 2012-07-23T13:24:35.910 に答える
0

を使用して、IComparable interface必要なものを達成できますか?

詳細については、 http://msdn.microsoft.com/en-us/library/system.icomparable.aspxを参照してください。

于 2012-07-23T13:24:10.997 に答える
0

初め。これには辞書を使用できません。辞書は、キーを比較する方法が 1 つしかない場合にのみ機能します。そしてそれは、前述のキー オブジェクトの GetHashCode および Equals オーバーライドによるものです。

2 つのオブジェクトを比較する場合は、異なるプロパティを比較するパラメーターを持つIComparerクラスを実装できます。

于 2012-07-23T13:26:02.437 に答える