比较两个自定义对象

时间:2012-07-23 13:21:23

标签: c# linq dictionary comparison icomparable

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(不在范围内)

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

4 个答案:

答案 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>,但它只允许您定义单个比较条件。

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

你可以:

  1. 为您计划使用的每个条件创建一个新的字典实例,并传递相应的IEqualityComparer<Filter>实现,或

  2. 使用普通List<Tuple<Filter, string>>,然后使用IEnumerable.Where对其进行过滤。

答案 3 :(得分:0)

首先。你不能使用字典。只有在有一种比较键的方法时,词典才有效。这是通过所述关键对象的GetHashCode和Equals覆盖。

如果要比较两个对象,可以实现一个IComparer类,其中的参数将比较不同的属性。