Дополнительный метод в C# 2.0

Есть много способов сделать это.

Я бы посоветовал вам превратить дерево в отсортированный массив троек из (parent, child, direction). Итак, начните с дерева1:

       4
     /   \
    3     2
   / \   /  \
  5   8 10   22

Это быстро становится:

(None, 4, None) # top
(4, 3, L)
(3, 5, L)
(3, 8, L)
(4, 2, R)
(2, 10, L)
(2, 22, R)

Что вы сортируете, чтобы получить

(None, 4, None) # top
(2, 10, L)
(2, 22, R)
(3, 5, L)
(3, 8, L)
(4, 2, R)
(4, 3, L)

Сделайте то же самое с другим, а затем отличайтесь от них.

Учитывая дерево и разность, вы можете сначала превратить дерево в эту форму, посмотреть на разность, понять, в каком направлении оно находится, и получить желаемое представление с помощью патча. Затем вы можете рекурсивно восстановить другое дерево.

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


Редактировать

Для точки из @ruakh предполагается, что значения не повторяются в дереве. Если они это сделают, то вы могли бы сделать такое представление:

       4
     /   \
    3     2
   / \   /  \
  5   8 10   22

становится

(, 4)
(0, 3)
(00, 5)
(01, 8)
(1, 2)
(10, 10)
(11, 22)

И теперь, если вы переместите поддеревья, они будут отображаться как большие различия. Но если вы просто измените один узел, это все равно будет небольшая разница.

11
задан Saif Khan 1 April 2009 в 20:09
поделиться

4 ответа

Вы не можете. C# 2.0 не имеет дополнительных методов вообще. Можно использовать дополнительные методы от C# 3.0 в Visual Studio предназначение 2008 года для.NET 2.0, как описано в моей статье "C#/.NET versions", но Вы не можете убедить компилятор C# 2.0 действовать, как будто это понимает, каковы дополнительные методы.

31
ответ дан 3 December 2019 в 00:48
поделиться

Теги говорят что.NET 2.0; Если Вы используете C# 3.0 (т.е. VS 2008) и нацелены на.NET 2.0, можно сделать это путем объявления ExtensionAttribute - или (легче) просто ссылочный LINQBridge.

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class |
        AttributeTargets.Method)]
    public sealed class ExtensionAttribute : Attribute { }
}

С этим на месте, дополнительные методы будут работать в.NET 2.0 с C# 3.0.

25
ответ дан 3 December 2019 в 00:48
поделиться

Дополнительные методы не будут работать в C# 2, потому что они полагаются на компилятор C# 3. Компилятор C# 3 знает, как сделать перевод из этого:

foo.Bar()

к этому:

ExtensionClass.Bar(foo)
2
ответ дан 3 December 2019 в 00:48
поделиться

Как JS заявила, C# 2.0 не имеет дополнительных методов.

Также тот дополнительный метод был бы определен как:

public static DataTable ToDataTable(this IDataReader reader)

Попытайтесь назвать его как:

DataReaderExtensions.ToDataTable(
   cust.GetCustomerOrderSummary((string)Session["CustomerNumber"])
   )
2
ответ дан 3 December 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: