Ссылка ObservableCollection на List - возможна?

213
14 июля 2018, 17:30

Вот рабочий пример:

static void Main(string[] args)
{
    List<string> a = new List<string>();
    List<string> b = a;
    a.Add("1");
    b.Add("2");
    Console.WriteLine(a.Count().ToString() + " " + a[0]);
    Console.WriteLine(b.Count().ToString() + " " + b[0]);
    Console.ReadKey();
}

Вот не рабочий пример:

static void Main(string[] args)
{
    List<string> a = new List<string>();
    ObservableCollection<string> b = new ObservableCollection<string>(a);
    a.Add("1");
    b.Add("2");
    Console.WriteLine(a.Count().ToString() + " " + a[0]);
    Console.WriteLine(b.Count().ToString() + " " + b[0]);
    Console.ReadKey();
}

Резюме:

Во втором варианте каждая переменная выводит только свои значения, в отличии от первого варианта, где каждая переменная выводит все значения.

Проблема:

Мне необходимо передать ссылку List'а ObservableCollection'у и получать все значения List'а через ObservableCollection. Также в случае редактирования ObservableCollection, что бы редактировался List.

Проще говоря нужно в итоге получить первый вариант, но принимающая переменная должна быть ObservableCollection.

Очень не хотельсь бы городить что то большой через события и свойства.

Вопросы:

  1. Почему это не работает?

  2. Возможно ли передать переменной ObservableCollection ссылку на переменную List.

  3. Возможно ли как-нибуть это вообще реализовать?

Answer 1
  1. Не работает потому что это разные экземпляры.

Как уже ответил Igor:

В первом случае List b лишь ссылается на List a, поэтому по сути в обоих случаях вы работаете с одним экземпляром списка, куда добавляете и откуда выводите.

Во втором, ObsevableCollection b и List a имеют свои независимые экземпляры, а инициализируя, как это делаете вы, в b лишь копируются текущие элементы a. Причём нужно понимать, что для структур идёт копирование, а для классов лишь ссылка на экземляр копируется.

  1. Ссылку передать нельзя. В реализации этих классов такой функции нет.

  2. В вашем случае нельзя.

Причина проста: List не имеет возможности хоть как-то уведомлять об изменении. Даже если вы захотите написать какой-то свой класс, то вы просто не сможете узнавать, изменился ли List или нет.

Что именно вы хотите реализовать не совсем понятно, поэтому подсказать трудно, но может в данном случае помочь BindingList. Уже с ним вы сможете написать свой класс, который будет связывать ObsevableCollection и BindingList, но опять же - базовой реализации нет.

Дополнение:

Если очень хочется и ObservableCollection и List, то пишите отдельный метод:

List<string> a = new List<string>();
ObservableCollection<string> b = new ObservableCollection<string>();
void Add(string newstring)
{
   a.Add(newstring);
   b.Add(newstring);
}

Можно и отдельный класс для этого написать, где будут все основные команды присутствовать (Clear, Remove, Insert). Но тогда все изменения нужно будет проводить только через этот вспомогательный класс. И если вдруг какой-нибудь из списков изменится где-нибудь не в этом классе, то об этом вы уже не узнаете.

Answer 2

где каждая переменная выводит все значения.

Потому что в первом примере a и b ссылаются на один и тот же объект.

Bторой пример аналогичен не

List<string> a = new List<string>();
List<string> b = a;

а

List<string> a = new List<string>();
List<string> b = new List<string>(a);

где a и b разные списки, которые ничего не знают о добавлении элементов друг в друга.

Вас не устроит общий интерфейс ICollection<T>?

READ ALSO
Как настроить коллбеки для Яндекс Кассы в php-окружении?

Как настроить коллбеки для Яндекс Кассы в php-окружении?

Есть ли какой-либо мануал более вменяемый чем официальная документация?

187
Проблема с !empty

Проблема с !empty

У меня есть данный код:

197
Помощь в разборке массива

Помощь в разборке массива

Есть такой массив -

246