C # Сортируемая коллекция, которая позволяет дублировать ключи - PullRequest
77 голосов
/ 19 апреля 2011

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

Демонстрационная часть кода ниже. Я хочу создать коллекцию, которая позволит мне добавить несколько объектов, и я могу получить отсортированную коллекцию на основе последовательности

SortedList list = new SortedList();

Header h = new Header();
h.XPos = 1;
h.name = "Header_1";
list.Add(h.XPos, h);

h = new Header();
h.XPos = 1;
h.name = "Header_2";
list.Add(h.XPos, h);

Я знаю, что SortedList не допустит этого, и я искал альтернативу. Я не хочу устранить дубликаты и уже попробовал List<KeyValuePair<int, object>>.

Спасибо.

Ответы [ 14 ]

0 голосов
/ 07 января 2014

Вы можете использовать SortedList, использовать свое значение для TKey и int (count) для TValue.

Вот пример: функция, которая сортирует буквы слова.

    private string sortLetters(string word)
    {
        var input = new System.Collections.Generic.SortedList<char, int>();

        foreach (var c in word.ToCharArray())
        {
            if (input.ContainsKey(c))
                input[c]++;
            else
                input.Add(c, 1);
        }

        var output = new StringBuilder();

        foreach (var kvp in input)
        {
            output.Append(kvp.Key, kvp.Value);
        }

        string s;

        return output.ToString();

    }
0 голосов
/ 09 декабря 2012

Linq.Lookup это круто и все, но если ваша цель состоит в том, чтобы просто зацикливать «ключи», допуская их дублирование, вы можете использовать эту структуру:

List<KeyValuePair<String, String>> FieldPatterns = new List<KeyValuePair<string, string>>() {
   new KeyValuePair<String,String>("Address","CommonString"),
   new KeyValuePair<String,String>("Username","UsernamePattern"),
   new KeyValuePair<String,String>("Username","CommonString"),
};

Тогда вы можете написать:

foreach (KeyValuePair<String,String> item in FieldPatterns)
{
   //use item.Key and item.Value
}

НТН

0 голосов
/ 02 августа 2012

Создать класс и запросить список:

Public Class SortingAlgorithm
{
    public int ID {get; set;}
    public string name {get; set;}
    public string address1 {get; set;}
    public string city {get; set;}
    public string state {get; set;}
    public int age {get; set;}
}

//declare a sorting algorithm list
List<SortingAlgorithm> sortAlg = new List<SortingAlgorithm>();

//Add multiple values to the list
sortAlg.Add( new SortingAlgorithm() {ID = ID, name = name, address1 = address1, city = city, state = state, age = age});
sortAlg.Add( new SortingAlgorithm() {ID = ID, name = name, address1 = address1, city = city, state = state, age = age});
sortAlg.Add( new SortingAlgorithm() {ID = ID, name = name, address1 = address1, city = city, state = state, age = age});

//query and order by the list
  var sortedlist = (from s in sortAlg
                    select new { s.ID, s.name, s.address1, s.city, s.state, s.age })
                                                     .OrderBy(r => r.ID)
                                                     .ThenBy(r=> r.name)
                                                     .ThenBy(r=> r.city)
                                                     .ThenBy(r=>r.state)
                                                     .ThenBy(r=>r.age);
0 голосов
/ 19 апреля 2011

Проблема в том, что вы используете в качестве ключа что-то, что не является ключом (потому что это происходит несколько раз).

Так что, если у вас есть реальные координаты, вы должны взять Point как ключ для вашего SortedList.

Или вы создаете List<List<Header>>, где ваш первый индекс списка определяет x-позицию, а внутренний список - y-позицию (или наоборот, если хотите).

...