2017-01-28 6 views
0

Может кто-то помочь мне понять эту ошибку компиляцииЛучший перегружен матч метод 'System.Collections.Generic.Dictionary <Int, System.Collections.Generic.Dictionary <string,int>> .Dictionary (интермедиат)'

Ошибка компиляции (строка 10, столбец 17): наилучший перегруженный метод соответствует для 'System.Collections.Generic.Dictionary> .Dictionary (int)' имеет некоторые недопустимые аргументы Ошибка компиляции (строка 13, col 5): Аргумент 1: невозможно преобразовать из 'System.Collections.Generic.IEnumerable >>' в 'int' Последний запуск: 8:16:27 pm Скомпилировать: 0s Выполнить: 0.188s Память: 0B CPU: 0s

, что указывает на Enumerable.Range(1,21) часть моего кода

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
class Solution 
{ 
    static void Main(String[] args) 
    { 
     int N = Int32.Parse(Console.ReadLine()); 
     var counter = new Dictionary<int, Dictionary<string, int>> 
      (
       Enumerable.Range(1,21) 
       .Select(i => new KeyValuePair<int, Dictionary<string, int>>(i, new Dictionary<string, int>())) 
      ); 
     for(int i = 0; i < N; ++i) 
     { 
      string[] input = Console.ReadLine().Split(' '); 
      switch(input[0]) 
      { 
       case "add":     
        for(int j = 1; j < input[1].Length; ++j) 
        { 
         string sub = input[1].Substring(0,j); 
         if(counter[j].ContainsKey(sub)) 
          counter[j][sub] += 1; 
         else 
          counter[j][sub] = 1; 
        } 
        break; 
       case "find": 
        Console.WriteLine 
        (
         counter[input[1].Length].ContainsKey(input[1]) 
         ? counter[input[1].Length][input[1]] 
         : 0 
        ); 
        break; 
       default: 
        break; 
      } 
     } 
    } 
} 

Я пытаюсь инициализировать словарь с парами ключ-значение

[1] = new Dictionary<string,int>(), 
[2] = new Dictionary<string,int>(), 
. 
. 
. 
[21] = new Dictionary<string,int>() 

Также мне любопытно, имеет ли C# лучшую структуру данных для попытки хранения коллекции строк с быстрым поиском подстрок (для этой задачи https://www.hackerrank.com/challenges/contacts).

+0

Вы можете использовать 'Enumerable.Range (1,21) .ToDictionary (т => т, новый словарь ());' – Saravanan

+0

@Saravanan Небольшая поправка в коде вы поделились. это должно быть 'var counter = Enumerable.Range (1, 21) .TDDictionary (t => t, t => новый словарь ());' –

+0

@ChetanRanpariya: получил это :) – Saravanan

ответ

2

Для параметрического конструктора словаря требуется первый аргумент «int» и второй тип «IEqualityComparor».

https://msdn.microsoft.com/en-us/library/6918612z(v=vs.110).aspx

Ни один из них не передается правильно, как часть вашего кода.

Вы можете упростить

var counter = new Dictionary<int, Dictionary<string, int>>(); 
foreach (var i in Enumerable.Range(1,21)) 
{ 
    counter.Add(i, new Dictionary<string, int>()); 
} 

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

var counter = Enumerable.Range(1, 21).ToDictionary(t => t, t => new Dictionary<string, int>()); 
Смежные вопросы