2010-12-15 2 views
0

Я хочу построить справочник как это:C# ассоциативный массив со словарем

Dictionary<String, ArrayList> myDic = new Dictionary<String, ArrayList>(); 

в конце концов, я хочу структуру, как:

["blabla"] => array(1,2,3) 
["foo"] => array(1,4,6,8) 
....... 

построить это я работать в цикле и в каждый цикл построить несколько строк,

первый вопрос:

как проверить каждый раз, если эта строка существует в словаре, если его не существует открыть новую запись в словаре с одним элементом в списке массива, если существует только добавить еще один элемент в список массива

и другого вопрос:

как я могу сортировать этот словарь в зависимости от количества элементов в списке массива (в порядке убывания), как:

["foo"] => array(1,4,6,2,8)  
["bar"] => array(4,6,2,8) 
["bla"] => array(1,2,3) 
["blo"] => array(1,2)  
    ....... 

спасибо!

ответ

2

Вместо ArrayList вы должны использовать массив или List<T>. Предполагая, что вы Dictionary<string, int> называется источник, это должно работать:

var items = source 
    .GroupBy(kvp => kvp.Key) 
    .Select(grp => new { Key = grp.Key, Items = grp.Select(kvp => kvp.Value).ToArray() }) 
    .OrderByDescending(i => i.Items.Length); 

Объяснить, Dictionary<TKey, TValue> реализует IEnumerable<KeyValuePair<TKey, TValue>> так можно рассматривать как последовательность пар ключ-значение. Группируйте по группам пары по ключу, а затем Select создает последовательность анонимного типа, которая содержит ключ и связанные значения в свойстве Key и Items соответственно. Затем эта последовательность упорядочивается по количеству элементов в массиве Items каждого объекта.

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

+0

i новичок в C#, если вы можете объяснить больше – 2010-12-15 19:47:41

1

Чтобы проверить, если ключ существует в словаре и использовать значение, если это произойдет, вы можете использовать TryGetValue:

ArrayList array; 
if(!myDic.TryGetValue("blabla", out array)) 
{ 
    array = new ArrayList(); 
    myDic["blabla"] = array; 
} 
array.Add(42); 
0

Would что-то вроде этой работы:

 if (myDic.ContainsKey(myString)) 
      myDic[myString].Add(myNumber); 
     else 
      myDic.Add(myString, new ArrayList(new int[] {myNumber})); 
5

Используйте правильный инструмент для работы. Структура данных, которую вы хотите, называется «многоязычным» - это словарь, который отображает от ключа к последовательности значений, а не от ключа к уникальному значению.

PowerCollections codebase содержит реализацию MultiDictionary, что возможно делает то, что вы хотите. Я бы использовал его, а не писал свой собственный.

Чтобы отсортировать словарь в последовательности пар ключ/последовательность, упорядоченных по длине последовательности, я бы использовал запрос LINQ с предложением «упорядочить по». Это похоже на самый простой способ сделать это.

Смежные вопросы