C # как реализовать наследование с помощью linq? - PullRequest
1 голос
/ 06 сентября 2010

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

class feature {
   Guid id;
   string featureName;
   string featureType;
   .....
}

List <feature> companyFeatures;
List <feature> divisionFeatures;

Список функций установлен на уровне компании.
Когда подразделение создано, оно должно наследовать все функции из списка функций компании. (Не копировать)

Если подразделение имеет значение свойства в конкретной функции, отличное от значения компании, пользователь хочет «сохранить» значение этого свойства в списке функций подразделения.

Это дает пользователю возможность добавлять функции на более позднем этапе на уровне компании и просматривать эти новые функции на уровне подразделения.

Обычно в списке деления не так много элементов, поскольку они совпадают со списком компаний.

Я попытался объединить оба списка, используя linq (внешнее соединение). Кажется, что происходит сбой, когда нет элемента для элемента списка на уровне деления.

Полагаю, я что-то делаю не так (возможно, я неправильно понимаю внешние соединения) Любая помощь будет оценена.

Кстати, есть ли шаблон проектирования, рекомендуемый для реализации наследования.

Будь счастлив и прекрасного дня

=============================================== =================================

Добавление примера (надеюсь, это прояснит мою цель)

List <feature> companyFeatures = new List <feature> 
{
    new <feature> { Guid1 , "Color" , "Text" , .... },
    new <feature> { Guid2 , "address" , "Link" , .... },
    new <feature> { Guid3 , "logo" , "Picture" , .... }
}

List <feature> divisionFeatures = new List <feature> 
{
    new <feature> { Guid2 , "address" , "text" , .... },
}

Список функций, которые я ищу после «наследования», должен быть:

{
    {Guid1, "Color" , "Text" , ...},
    {Guid2, "address" , "text" , ...},
    {Guid3, "logo" , "Picture" , ...}
}

Обратите внимание, что в Guid2 теперь есть значение текста для свойства type. Надеюсь, это прояснит.

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Технически это не наследование -

Если цель состоит в том, чтобы вернуть набор всех функций в списках companyFeatures и divisionFeatures, то вы можете просто сделать:

IEnumerable<feature> totalFeatures = companyFeatures.Concat(divisionFeatures);

Метод Enumerable.Concat вернет IEnumerable<T>, который содержит элементы из обоих списков.

0 голосов
/ 06 сентября 2010

Поправь меня, если я неправильно понял.У вас есть класс Company и класс Division, и у них обоих есть поле List<Feature>?Что-то вроде ...

public class Company {
    // ...
    public List<Feature> CompanyFeatures;
    // ...
}
public class Division {
    public Company Company;  // The company to which the division belongs
    // ...
    public List<Feature> DivisionFeatures;
    // ...
}

Если это так, то я бы предложил превратить список возможностей в свойство только для чтения, чтобы он автоматически позаботился о «наследовании».Например, ...

public class Division {
    public Company Company;  // The company to which the division belongs
    // ...
    private List<Feature> _divisionFeatures;  // private now
    public IEnumerable<Feature> DivisionFeatures {
        get {
            // Take all the features for the divison...
            return _divisionFeatures.Concat(
                // ... and add all the company features except for those that
                // have the same name as one of the division features.
                Company.CompanyFeatures.Where(cf => !_divisionFeatures
                    .Any(df => df.Name == cf.Name))
            );
        }
    }
    // ...
}

В качестве альтернативы, вы, конечно, можете сделать List<Feature> общедоступным (чтобы вы могли по-прежнему манипулировать им извне) и вызвать свойство как-то вроде DivisionFeaturesWithInheritance.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...