C # Проверка массива объектов на наличие дубликатов - PullRequest
1 голос
/ 26 октября 2009

У меня есть массив объектов Customer [], и я хочу использовать его для создания словаря . Какой самый простой способ проверить массив на наличие дубликатов перед загрузкой словаря? Я хочу избежать "ArgumentException: элемент с тем же ключом уже был добавлен". Спасибо.

Ответы [ 6 ]

6 голосов
/ 26 октября 2009

Просто позвоните Dictionary.ContainsKey (ключ), прежде чем добавлять своих клиентов.

5 голосов
/ 26 октября 2009

Вы можете использовать LINQ для выполнения обоих действий:

Customer[] customers; // initialized somehow...
var customerDictionary = customers.Distinct().ToDictionary( cust => cust.SomeKey );

Если вы будете строить словарь менее простым способом, вы можете просто использовать метод расширения Distinct(), чтобы получить уникальный массив, например:

Customer[] uniqueCustomers = customers.Distinct().ToArray();

Если вам необходимо знать о возможных дубликатах, сначала вы можете использовать GroupBy( c => c ), чтобы определить, какие элементы имеют дубликаты.

Наконец, если вы не хотите использовать LINQ, вы можете создать словарь на лету и использовать проверку предварительных условий при добавлении каждого элемента:

var customerDictionary = new Dictionary<Customer,string>();
foreach( var cust in customers )
{
    if( !customerDictionary.ContainsKey(cust) )
        customerDictionary.Add( cust, cust.SomeKey ); 
}
2 голосов
/ 26 октября 2009

Наиболее эффективный способ сделать это с точки зрения ОБОИХ ЭФФЕКТИВНОСТИ и КОДЕКСА это:

dict[key] = value

Таким образом, упомянутое вами исключение никогда не будет выброшено, и поиск ключа не произойдет дважды

2 голосов
/ 26 октября 2009

Насколько большой массив? и насколько вероятно, что будут дубликаты?

Проверка каждого элемента массива на соответствие всем остальным - довольно дорогая операция.

Было бы быстрее позвонить Dictionary.ContainsKey(key) перед добавлением каждого элемента.

ПРИМЕЧАНИЕ: Если дубликаты редки, вы можете использовать обработку исключений, но это плохая практика программирования.

1 голос
/ 26 октября 2009

Каково ваше определение дубликата в этом случае?

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

Иногда, хотя концепция равенства не так проста, является ли другой экземпляр объекта равным одинаковых данных ? В этом случае вам, вероятно, понадобится реализация IEqualityComparer.

0 голосов
/ 26 октября 2009

Почему не это ??

Customers.Distinct.ToDictionary(o=>o, GenerateString(o));
...