Количество списков массивов в словаре C #

#c# #dictionary #arraylist

#c# #словарь #список массивов

Вопрос:

Есть ли простой способ подсчитать значения определенных словарных ключей values?

 static void Main()
{
    Dictionary<string, ArrayList> SpecTimes = new Dictionary<string, ArrayList>;
    ArrayList times = new ArrayList();
    string count = "";

    times.Add = "000.00.00";
    times.Add = "000.00.00";
    times.Add = "000.00.00";

   string spec = "A101";

   SpecTimes.Add(spec,times);

   count = SpecTimes[spec].values.count;
}
  

Комментарии:

1. Это выглядит как половина C # и половина… Я не знаю.

2. Не используйте ArrayList s. Вместо этого используйте List<T>

3. Почему вы смешиваете общие коллекции и не общие коллекции? И не использовать скобки в вызовах вашего метода? Пожалуйста, покажите реальный код.

Ответ №1:

Я не тестировал это, но это должно быть близко к тому, что вам нужно.

 static void Main()
{
  Dictionary<string, List<string>> SpecTimes = new Dictionary<string, List<string>>();
  List<string> times = new List<string>();
  int count = 0;

  times.Add = "000.00.00";
  times.Add = "000.00.00";
  times.Add = "000.00.00";

  string spec = "A101";

  SpecTimes.Add(spec,times);

  // check to make sure the key exists, otherwise you'll get an exception.
  if(SpecTimes.ContainsKey(spec))
  {
      count = SpecTimes[spec].Count;
  }
}
  

Ответ №2:

В вашем коде есть некоторые ошибки, поэтому он все равно не будет компилироваться. Вы должны изменить это следующим образом:

 static void Main()
{
    IDictionary<string, IList<string>> specTimes = new Dictionary<string, IList<string>>();
    IList<string> times = new List<string>();

    times.Add("000.00.00");
    times.Add("000.00.00");
    times.Add("000.00.00");

    string spec = "A101";
    specTimes.Add(spec, times);

    int count = specTimes[spec].Count;
}
  

Поскольку вы уже получили количество вхождений, в чем проблема в любом случае?

Ответ №3:

Ваш код не будет компилироваться как есть, и вам не следует использовать ArrayList, а скорее List<T> (как указал СЛакс).) При этом у List<T> есть Count свойство, поэтому SpecTime[key].Count должно работать просто отлично (при условии, что ключ действительно находится в словаре.)

Комментарии:

1. Я знаю, что вы хотели сказать, что Dictionary<TKey, TValue> имеет Count свойство.

2. @Rick Это так, но почему это должно быть тем, что я имею в виду?

3. Чтение слишком быстрое. Mea culpa. ( SpecTime.Count против SpecTime[key].Count )

Ответ №4:

Если вы используете .NET 3.5 и выше, используйте Linq для этого:

 var count = (from s in SpecTimes where SpecTimes.Key == <keyword> select s).Count();
  

в любом случае, как все предлагали, вам следует выбрать List<string> вместо ArrayList

Ответ №5:

При использовании .NET 3.5 вы можете использовать Linq для фильтрации и подсчета. Однако по возможности избегайте ArrayList и используйте generics.

     static void Main(string[] args)
    {
        Dictionary<string, List<string>> SpecTimes = new Dictionary<string, List<string>>();
        List<string> times = new List<string>();
        int count;

        times.Add("000.00.00");
        times.Add("000.00.00");
        times.Add("000.00.00");
        times.Add("000.00.01");

        string spec = "A101";

        SpecTimes.Add(spec,times);

        // gives 4
        count = SpecTimes[spec].Count;

        // gives 3
        count = (from i in SpecTimes[spec] where i == "000.00.00" select i).Count();

        // gives 1
        count = (from i in SpecTimes[spec] where i == "000.00.01" select i).Count();
    }