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根据有时一个,有时是所有属性比较两个对象的最佳方法是什么?我的意思是我有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,但使用f2我只想找到第一个 KVP,因为Start在第二个对象中不满足条件Start+ Endfrom f2(它在范围之外)

编辑 字典超出了这个问题的范围。它一定要是。我只需要比较机制。我不创建字典来做到这一点。我需要它来存储一些对我很重要的数据。

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

你能用IComparable interface来实现你所需要的吗?

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.icomparable.aspx 。

于 2012-07-23T13:24:10.997 回答
0

如果你需要通过多个标准进行比较,一个Dictionary<Filter, string>是不够的。您可以IEqualityComparer<Filter>在实例化它时提供自定义,但它只允许您定义一个比较标准。

字典的重点是允许通过某个键进行快速查找,如果您希望更改您的键,您将无法从中受益。

您可以:

  1. 为您计划使用的每个标准创建一个新的字典实例,并通过适当的IEqualityComparer<Filter>实现,或者

  2. 使用一个普通的List<Tuple<Filter, string>>,然后使用过滤它IEnumerable.Where

于 2012-07-23T13:24:35.910 回答
0

第一的。您不能为此使用字典。只有当您有一种比较键的方法时,字典才有效。那是通过 GetHashCode 和 Equals 覆盖所述关键对象。

如果你想比较两个对象,你可以实现一个IComparer类,它有比较不同属性的参数。

于 2012-07-23T13:26:02.437 回答