Как я могу сократить List <List <KeyValuePair <строка, строка >>>? - PullRequest
3 голосов
/ 25 августа 2009

Я хочу сохранить список списков пар ключ-значение в облегченной структуре. Это кажется слишком громоздким. Что лучше? Добавляет ли List > дополнительные издержки? Какие еще варианты доступны?

Ответы [ 5 ]

10 голосов
/ 25 августа 2009

Рассмотрите возможность использования псевдонима для краткости:

namespace Application
{
    using MyList = List<List<KeyValuePair<string, string>>>;

    public class Sample
    {
        void Foo()
        {
            var list = new MyList();
        }
    }
}
3 голосов
/ 25 августа 2009

И List, и Dictionary довольно эффективны, поэтому я бы не стал дважды думать об их использовании. (Если вы не собираетесь хранить в своем списке несколько миллиардов словарей, но это не очень часто встречается.)

Если вы думаете, что List<Dictionary<string, string>> слишком много для ввода, вы можете сказать в своей преамбуле

using LoDSS = System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>;

Обратите внимание, что это просто псевдоним, не требующий подклассов.

2 голосов
/ 25 августа 2009

Словарь и List > могут быть в порядке, в зависимости от того, какие данные вы хотите передать. Кроме того, если вы собираетесь использовать один и тот же тип long везде, вы можете определить его в другом месте для краткости. Примерно так:

public class MyShorthand : List<List<KeyValuePair<string, string>>> { }

Или вы можете использовать оператор using для определения псевдонима типа:

using MyShorthand = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>>>;
0 голосов
/ 25 августа 2009

Для ясности я бы обернул вашу KeyValuePair<string, string> во что-то более короткое, например. StringPair, а также определить сокращение для списка StringPair. Это сократит ваш синтаксис и поможет читабельности ИМХО.

public class StringPair : KeyValuePair<string, string> { }

public class StringPairList : List<stringPair> { }

..


var jaggedList = new List<StringPairList>();
0 голосов
/ 25 августа 2009

Если вы обращаетесь к значениям по ключу, используйте словарь, для чего и предназначен. Чтобы уменьшить накладные расходы на словари, попробуйте дать им начальную емкость.

В качестве альтернативы (если оба списка довольно малы), вы можете реализовать собственный объект хеширования, что-то вроде этого (кроме более симпатичного):

public class MyDictionary
{
    private Dictionary<string, string> values;

    public MyDictionary()
    {
        values = new Dictionary<string, string>();
    }

    public void Add(int index, string key, string value)
    {
        int hash = ((0xFFFF) & index) * (0xFFFF) + (0xFFFF) & key.GetHashCode();
        values.Add(hash, value);
    }
    public string Get(int index, string key)
    {
        int hash = ((0xFFFF) & index) * (0xFFFF) + (0xFFFF) & key.GetHashCode();
        return values[hash];
    }
}
...