Обратный отсортированный словарь в.NET

Отредактируйте php.ini и добавьте:

extension=php_pdo_mysql.dll 

Затем перезапустите веб-сервер

40
задан nawfal 11 June 2014 в 10:17
поделиться

3 ответа

Сам SortedDictionary не поддерживает обратную итерацию, но у вас есть несколько возможностей для достижения того же эффекта.

  1. Используйте .Reverse -Method (Linq). (Это должно будет предварительно вычислить весь вывод словаря, но это самое простое решение)

     var Rand = new Random ();
    
    var Dict = new SortedDictionary  ();
    
    for (int i = 1; i <= 10; ++ i) {
     var newItem = Rand.Next (1, 100);
     Dict.Add (newItem, (newItem * newItem) .ToString ());
    }
    
    foreach (var x в Dict.Reverse ()) {
     Console.WriteLine ("{0} -> {1}", x.Key, x.Value);
    }
    
  2. Произвести сортировку словаря в порядке убывания.

     class DescendingComparer : IComparer  где T: IComparable  {
     public int Compare (T x, T y) {
     вернуть y.CompareTo (x);
     }
    }
    
    // ...
    
    var Dict = new SortedDictionary  (новый DescendingComparer  ());
    
  3. Используйте вместо него SortedList . Производительность не так хороша, как у словаря (O (n) вместо O (logn)), но у вас есть произвольный доступ к элементам, как в массивах. Когда вы используете общий интерфейс IDictionary, вам не придется изменять остальную часть кода.

Edit :: Iterating on SortedLists

Вы просто получаете доступ к элементам по индексу!

var Rand = new Random();


var Dict = new SortedList<int, string>();

for (int i = 1; i <= 10; ++i) {
    var newItem = Rand.Next(1, 100);
    Dict.Add(newItem, (newItem * newItem).ToString());
}

// Reverse for loop (forr + tab)
for (int i = Dict.Count - 1; i >= 0; --i) {
    Console.WriteLine("{0} -> {1}", Dict.Keys[i], Dict.Values[i]);
}
67
ответ дан 27 November 2019 в 01:23
поделиться

Самый простой способ определить SortedDictionary в порядке, обратном началу, - предоставить ему IComparer , который выполняет сортировку в порядке, обратном нормальному.

Вот код из MiscUtil , который может упростить вам задачу:

using System.Collections.Generic;

namespace MiscUtil.Collections
{
    /// <summary>
    /// Implementation of IComparer{T} based on another one;
    /// this simply reverses the original comparison.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public sealed class ReverseComparer<T> : IComparer<T>
    {
        readonly IComparer<T> originalComparer;

        /// <summary>
        /// Returns the original comparer; this can be useful
        /// to avoid multiple reversals.
        /// </summary>
        public IComparer<T> OriginalComparer
        {
            get { return originalComparer; }
        }

        /// <summary>
        /// Creates a new reversing comparer.
        /// </summary>
        /// <param name="original">The original comparer to 
        /// use for comparisons.</param>
        public ReverseComparer(IComparer<T> original)
        {
            if (original == null)
            { 
                throw new ArgumentNullException("original");
            }
            this.originalComparer = original;
        }

        /// <summary>
        /// Returns the result of comparing the specified
        /// values using the original
        /// comparer, but reversing the order of comparison.
        /// </summary>
        public int Compare(T x, T y)
        {
            return originalComparer.Compare(y, x);
        }
    }
}

Затем вы должны использовать:

var dict = new SortedDictionary<string, int>
     (new ReverseComparer<string>(StringComparer.InvariantCulture));

(или любой другой тип, который вы использовали).

Если вы хотите выполнить итерацию только в одном направлении, это будет более эффективным, чем изменение порядка в обратном порядке после этого.

17
ответ дан 27 November 2019 в 01:23
поделиться

Если вы используете .NET 3.5, вы можете использовать метод расширения OrderByDescending:

        var dictionary = new SortedDictionary<int, string>();
        dictionary.Add(1, "One");
        dictionary.Add(3, "Three");
        dictionary.Add(2, "Two");
        dictionary.Add(4, "Four");



        var q = dictionary.OrderByDescending(kvp => kvp.Key);
        foreach (var item in q)
        {
            Console.WriteLine(item.Key + " , " + item.Value);
        }
-1
ответ дан 27 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

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