Как получить только разные поля - PullRequest
0 голосов
/ 19 июля 2011

У меня есть два объекта класса.

Мне нужно сравнить каждое поле с другим, и если данные отличаются, чтобы выполнить определенные действия

class A
{
    int id;
    string text;
    public int Id
    {
        get { return  id; }
    }
    public string Text
    {
        get { return  text; }
    }
}

как я вижу:

Dictionary<string, string> list = aObj.different(bObj);

list.Key - name property
list.Value - value of the bObj if it is different

Ответы [ 4 ]

3 голосов
/ 19 июля 2011
public Dictionary<string, object> GetDifferences(A target)
{
    Dictionary<string, object> differences = new Dictionary<string, object>();
    foreach (PropertyInfo pi in typeof(A).GetProperties())
    {
        if (!pi.GetValue(this, null).Equals(pi.GetValue(target, null)))
            differences.Add(pi.Name, pi.GetValue(target, null));
    }
    return differences;
}
1 голос
/ 19 июля 2011

Сделать класс A: IComparable и определить логику для CompareTo ()

Тогда вы можете использовать A.CompareTo. Преимущество заключается в том, что вы можете использовать это в Списке <>, если вам нужно отсортировать.

1 голос
/ 19 июля 2011

Я бы, вероятно, написал помощника, который использует отражение, чтобы получить свойства обоих объектов, перебирает их и сравнивает значения от 1 до 1.

Это может помочь вам

И этот тоже

edit

Я думаю, было бы проще, если бы оба ваших объекта реализовали один и тот же интерфейс.

0 голосов
/ 19 июля 2011

Вы можете сделать это разными способами.Лучший зависит от длины ваших списков атрибутов.Самый простой способ - выполнить итерацию по первому списку, и для каждого элемента выполнить итерацию по второму списку и попытаться определить, являются ли они разными.20%) вы должны отсортировать два списка, перебрать оба идентифицирующих совпадающих элемента.

Для больших списков с несовпадающими длинами вы можете создать словарь с большим списком, перебирая меньший в поисках соответствующего элементапредыдущий построенный словарь.

...