Собрать вместе уникальные объекты из списков.
От: Nikolay_P_I  
Дата: 15.11.10 06:11
Оценка:
Есть что-то вроде

class ClassA
{
   List<ClassB> BList;

   void AppendUniqueB(List<ClassB> listB)
   {
      //????
   }   
}


Задача — пополнить BList уникальными объектами из listB. Инструментал — FW 3.5.

Как такое вообще сделать — я знаю. Foreach по listB с Union. Но мне мой вариант не нравится тем, что на каждом ClassB создается новый IEnumerator, а после цикла приходится делать BList.Clear, BList.AddRange(new List<ClassB>(итоговый IEnumerator)).
Re: Собрать вместе уникальные объекты из списков.
От: _FRED_ Черногория
Дата: 15.11.10 06:20
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Есть что-то вроде

N_P>class ClassA
N_P>{
N_P>   List<ClassB> BList;

N_P>   void AppendUniqueB(List<ClassB> listB)
N_P>   {
N_P>      //????
N_P>   }   
N_P>}

N_P>Задача — пополнить BList уникальными объектами из listB. Инструментал — FW 3.5.

Чть такое "пополнить" я не знаю.

Если не надо учитывать то, что уже в BList, то
BList.AddRange(listB.Distinct());
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Собрать вместе уникальные объекты из списков.
От: Nikolay_P_I  
Дата: 15.11.10 07:15
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Чть такое "пополнить" я не знаю.


_FR>Если не надо учитывать то, что уже в BList, то

_FR>
_FR>BList.AddRange(listB.Distinct());
_FR>


Спасибо, но это не совсем то... "Пополнить" — значит "добавить к уже существующим". В тот же List.

Ну то есть — есть список BList с 1,2,3, есть списки listB с 3,4 и 4,5 — в результате в BList должно быть 1,2,3,4,5. Список Blist — большой и там изначально все уникальное. В каждом из списков listB тоже все уникальное, но вот в двух разных listB могут быть одинаковые значения.
Re[3]: Собрать вместе уникальные объекты из списков.
От: _FRED_ Черногория
Дата: 15.11.10 07:23
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

_FR>>Чть такое "пополнить" я не знаю.

_FR>>Если не надо учитывать то, что уже в BList, то
_FR>>BList.AddRange(listB.Distinct());


N_P>Спасибо, но это не совсем то... "Пополнить" — значит "добавить к уже существующим". В тот же List.


N_P>Ну то есть — есть список BList с 1,2,3, есть списки listB с 3,4 и 4,5 — в результате в BList должно быть 1,2,3,4,5. Список Blist — большой и там изначально все уникальное. В каждом из списков listB тоже все уникальное, но вот в двух разных listB могут быть одинаковые значения.


Если можно быть уверенным, что в BList нет дубликатов, то

var set = new HashSet<ClassB>(BList);
foreach(var item in listB) {
  if(!set.Add(item)) {
    BList.Add(item);
  }//if
}//if
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Собрать вместе уникальные объекты из списков.
От: Nikolay_P_I  
Дата: 15.11.10 07:51
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Если можно быть уверенным, что в BList нет дубликатов, то


_FR>
_FR>var set = new HashSet<ClassB>(BList);
_FR>foreach(var item in listB) {
_FR>  if(!set.Add(item)) {
_FR>    BList.Add(item);
_FR>  }//if
_FR>}//if
_FR>


Спасибо за подсказку c HashSet, но надо List — так интерфейс расписан.
Re[5]: Собрать вместе уникальные объекты из списков.
От: _FRED_ Черногория
Дата: 15.11.10 07:54
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

_FR>>Если можно быть уверенным, что в BList нет дубликатов, то

_FR>>var set = new HashSet<ClassB>(BList);
_FR>>foreach(var item in listB) {
_FR>>  if(!set.Add(item)) {
_FR>>    BList.Add(item);
_FR>>  }//if
_FR>>}//if


N_P>Спасибо за подсказку c HashSet, но надо List — так интерфейс расписан.


BList в моём примере и есть List.
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Собрать вместе уникальные объекты из списков.
От: Nikolay_P_I  
Дата: 15.11.10 08:16
Оценка:
Здравствуйте, _FRED_, Вы писали:

N_P>>Спасибо за подсказку c HashSet, но надо List — так интерфейс расписан.


_FR>BList в моём примере и есть List.


Спасибо, так и сделаю — не сразу понял, что HashSet как внешний арбитраж используется.

Чисто теоретический вопрос — а можно красиво тоже самое сделать через LINQ или IEnumerable Extensions ?
Re[7]: Собрать вместе уникальные объекты из списков.
От: _FRED_ Черногория
Дата: 15.11.10 09:21
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>>>Спасибо за подсказку c HashSet, но надо List — так интерфейс расписан.

_FR>>BList в моём примере и есть List.
N_P>Спасибо, так и сделаю — не сразу понял, что HashSet как внешний арбитраж используется.
N_P>Чисто теоретический вопрос — а можно красиво тоже самое сделать через LINQ или IEnumerable Extensions ?

Только не нужно:

var set = new HashSet<ClassB>(BList);
BList.AddRange(listB.Where(item => !set.Add(item)));
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Собрать вместе уникальные объекты из списков.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.10 18:01
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Чисто теоретический вопрос — а можно красиво тоже самое сделать через LINQ или IEnumerable Extensions ?


BList.AddRange(
    listB
        .Distinct()
        .Except(BList));
... << RSDN@Home 1.2.0 alpha 4 rev. 1476 on Windows 7 6.1.7600.0>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.