Добавление отсортированных данных в хеш-таблицу или словарь при чтении данных из файла - PullRequest
1 голос
/ 22 июля 2011

У меня есть файл, содержащий
A, 15
B, 67
C, 45
D, 10

Я читаю данные из файла, но я хотел прочитать данные в словарь или хеш-таблицу, но данные должны быть отсортированы в них по значению
B, 67
С, 45
A, 15
D.10

Если какой-либо другой список будет работать эффективно, пожалуйста, предложите

Спасибо

Ответы [ 3 ]

5 голосов
/ 22 июля 2011

A Dictionary<,> / Hashtable не имеет определенной сортировки; это не будет работать. SortedDictionary<,> сортируется по ключу , а не по значению , поэтому это не будет работать. Лично я думаю, что вы должны просто использовать обычный List<T> (для некоторых простых T с двумя свойствами), и после загрузки его:

list.Sort((x,y) => y.SecondProp.CompareTo(x.SecondProp));

Тонкий переключатель x / y достигает «нисходящего». Если вам также нужны данные, введенные в первом свойстве, то отдельно сохраните Dictionary<string,int>.

Полный пример:

class Program
{
    static void Main()
    {
        List<MyData> list = new List<MyData>();
        // load the data (replace this with a loop over the file)
        list.Add(new MyData { Key = "B", Value = 67 });
        list.Add(new MyData { Key = "C", Value = 45 });
        list.Add(new MyData { Key = "A", Value = 15 });
        list.Add(new MyData { Key = "D", Value = 10 });
        // sort it
        list.Sort((x,y)=> y.Value.CompareTo((x.Value)));
        // show that it is sorted
        foreach(var item in list)
        {
            Console.WriteLine("{0}={1}", item.Key, item.Value);

        }
    }
}

internal class MyData
{
    public string Key { get; set; }
    public int Value { get; set; }
}
0 голосов
/ 22 июля 2011

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

В любом случае, если вы хотите получить доступ к данным в словаре, упорядоченном по значению, вы можете использовать запрос LINQ для этого:

Dictionary<string, int> data = new Dictionary<string, int>();
data.Add("A", 15);
data.Add("B", 67);
data.Add("C", 45);
data.Add("D", 10);

var ordered = (from d in data
                orderby d.Value
                select new Tuple<string, int>(d.Key, d.Value));

foreach (var o in ordered)
    Console.WriteLine(o.Item1 + "," + o.Item2);            
0 голосов
/ 22 июля 2011

Или используйте IComparable <>

Полный пример:

 public class Program
    {
        public static void Main(string[] args)
        {
            List<MyData> list = new List<MyData>();
            // load the data (replace this with a loop over the file)    
            list.Add(new MyData { Key = "B", Value = 67 });
            list.Add(new MyData { Key = "C", Value = 45 });
            list.Add(new MyData { Key = "A", Value = 15 });
            list.Add(new MyData { Key = "D", Value = 10 });

            list.Sort();           
        }
    }


    internal class MyData : IComparable<MyData>
    {
        public string Key { get; set; }
        public int Value { get; set; }
        public int CompareTo(MyData other)
        {
            return other.Value.CompareTo(Value);
        }

        public override string ToString()
        {
            return Key + ":" + Value;
        }
    } 
...