PowerCollections - MultiDictionary «Удалить», удаляя все значения, когда значение не найдено - PullRequest
2 голосов
/ 13 мая 2011

Я использую библиотеку powercollections из http://powercollections.codeplex.com/

Первый тест пройден, однако второй тест не пройден.Я бы не ожидал, что Remove удалит все элементы из словаря, если значение не будет найдено.

Это проблема или я неправильно понимаю, как Remove функционирует?

[Test]
public void passing_test()
{
    var classes = new MultiDictionary<string, object>(false);
    classes.Add("class", "class_name1");
    classes.Add("class", "class_name2");
    classes.Remove("class", "class_name2");

    Assert.AreEqual(1, classes.Count);
}

[Test]
public void failing_test()
{
    var classes = new MultiDictionary<string, object>(false);
    classes.Add("class", "class_name1");
    classes.Remove("class", "class_name2");

    Assert.AreEqual(1, classes.Count);
}

1 Ответ

2 голосов
/ 13 мая 2011

На самом деле это похоже на ошибку в коде:

        /// <summary>
        /// Removes a given value from the values associated with a key. If the
        /// last value is removed from a key, the key is removed also.
        /// </summary>
        /// <param name="key">A key to remove a value from.</param>
        /// <param name="value">The value to remove.</param>
        /// <returns>True if <paramref name="value"/> was associated with <paramref name="key"/> (and was
        /// therefore removed). False if <paramref name="value"/> was not associated with <paramref name="key"/>.</returns>
        public sealed override bool Remove(TKey key, TValue value)
        {
            KeyAndValues keyValues = new KeyAndValues(key);
            KeyAndValues existing;

            if (hash.Find(keyValues, false, out existing)) {
                // There is an item in the hash table equal to this key. Find the value.
                int existingCount = existing.Count;
                int valueHash = Util.GetHashCode(value, valueEqualityComparer);
                int indexFound = -1;
                for (int i = 0; i < existingCount; ++i) {
                    if (Util.GetHashCode(existing.Values[i], valueEqualityComparer) == valueHash &&
                        valueEqualityComparer.Equals(existing.Values[i], value)) 
                    {
                        // Found an equal existing value
                        indexFound = i;
                    }
                }

                if (existingCount == 1) {
                    // Removing the last value. Remove the key.
                    hash.Delete(existing, out keyValues);
                    return true;
                }

Обратите внимание, как они проверяют на existingCount == 1? Несмотря на то, что введенные значения различаются, нет кода, позволяющего проверить, был ли индекс найден в поиске до вызова hash.Delete. Правильный способ исправить это - сделать что-то вроде:

            if (existingCount == 1 && indexFound != -1) {
                // Removing the last value. Remove the key.
                hash.Delete(existing, out keyValues);
                return true;
            }

Вот полный источник: http://powercollections.codeplex.com/SourceControl/changeset/view/6259#71508

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