IDictionary <строка, строка> по сравнению со Словарем <строка, строка>

Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.

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

use warnings;
use strict;    
use Data::Dump qw(dd);

sub uniq_arys {
    my %seen; 
    grep { not $seen{join $;, @

Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.

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

[110]

Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.

Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка '' вполне подойдет.

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


Пример модуля: используйте uniq_by из List :: UtilsBy

use List::UtilsBy qw(uniq_by);

my @no_dupes = uniq_by { join '', @

Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.

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

[110]

Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.

Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка '' вполне подойдет.

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


Пример модуля: используйте uniq_by из List :: UtilsBy

[111]

Это более или менее совпадает с подпунктом выше. [1114 ] } @data;

Это более или менее совпадает с подпунктом выше. [1114 ]}++ } @_; } my @data = ( [ qw(one two three) ], [ qw(ten eleven twelve) ], [ qw(10 11 12) ], [ qw(ten eleven twelve) ], ); my @data_uniq = uniq_arys(@data); dd \@data_uniq;

Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.

Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка '' вполне подойдет.

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


Пример модуля: используйте uniq_by из List :: UtilsBy

use List::UtilsBy qw(uniq_by);

my @no_dupes = uniq_by { join '', @

Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.

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

[110]

Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.

Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка '' вполне подойдет.

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


Пример модуля: используйте uniq_by из List :: UtilsBy

[111]

Это более или менее совпадает с подпунктом выше. [1114 ] } @data;

Это более или менее совпадает с подпунктом выше. [1114 ]

12
задан leora 30 November 2008 в 12:59
поделиться

3 ответа

Значение использования интерфейса всегда является тем же: Вы не должны изменять клиентский код при переключении на другую реализацию бэкенда.

Полагайте, что профилирование кода более поздние шоу, что реализация хеш-таблицы (использовал в Dictionary класс), не подходит для Вашей задачи и что дерево двоичного поиска работало бы лучше. Если Вы кодировали к интерфейсу, затем переключающему реализацию, просто. Однако, при использовании реального класса необходимо изменить намного больше кода в намного большем количестве мест. => Это стоит времени и денег.

27
ответ дан 2 December 2019 в 03:29
поделиться

IDictionary включает более свободную связь.

Скажите, что у Вас есть метод как это:

void DoSomething(IDictionary<string, string> d)
{
   //...
}

Можно использовать его как это:

Dictionary<string, string> a = new Dictionary<string, string>();
SortedDictionary<string, string> b = new SortedDictionary<string, string>();
DoSomething(a);
DoSomething(b);
15
ответ дан 2 December 2019 в 03:29
поделиться

На основе Вашего предыдущего вопроса Класс наследовался универсальный dictionary<string, IFoo> и Интерфейс и обсуждение в ответах, я предполагаю Ваше выяснение больше о наследовании от вместо использования.

Реализация из Словаря прекрасна, если Ваше довольное путем словарь реализовано. Если Вы хотите изменить что-то, то реализация IDictionary лучше.

По моему скромному мнению, если Вы собираетесь покрыть существующего участника 'новым' затем, лучше реализовать интерфейс, а не наследоваться исходному классу.

1
ответ дан 2 December 2019 в 03:29
поделиться
Другие вопросы по тегам:

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