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
的条件End
+ f2
(不在范围内)
修改 字典超出了本问题的范围。它一定要是。我只需要比较机制。我不创建字典来做到这一点。我需要它来存储一些对我很重要的数据。
答案 0 :(得分: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 */);
}
我认为情况并不完全符合您的要求,但您可能会从这里弄明白......
答案 1 :(得分:0)
您可以使用IComparable
interface
来实现您的需求吗?
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.icomparable.aspx。
答案 2 :(得分:0)
如果您需要按多个条件进行比较,则一个Dictionary<Filter, string>
是不够的。您可以在实例化时提供自定义IEqualityComparer<Filter>
,但它只允许您定义单个比较条件。
字典的要点是允许通过某个键快速查找,如果您希望更改密钥,您将无法从中受益。
你可以:
为您计划使用的每个条件创建一个新的字典实例,并传递相应的IEqualityComparer<Filter>
实现,或
使用普通List<Tuple<Filter, string>>
,然后使用IEnumerable.Where
对其进行过滤。
答案 3 :(得分:0)
首先。你不能使用字典。只有在有一种比较键的方法时,词典才有效。这是通过所述关键对象的GetHashCode和Equals覆盖。
如果要比较两个对象,可以实现一个IComparer类,其中的参数将比较不同的属性。