2016-04-10 2 views
1

Я пытаюсь напечатать mycounters[0] с помощью метода PrintCounters(), но кажется, что PrintCounters(mycounters[0]) не работает, это проблема синтаксиса?Вызов PrintCounters() не выполняется, почему?

using System; 
using System.Collections.Generic; 
namespace Counter 
{ 
class MainClass 
{ 
    List<Counter> counters = new List<Counter>(); 
    public static void PrintCounters (IEnumerable<Counter> counters) 
    { 
     foreach (Counter c in counters) 
     { 
      Console.WriteLine("{0} is {1}", c.Name,c.Count); 

     } 
    } 
    public static void Main (string[] args) 
    { 
     List<Counter> mycounters = new List<Counter>(); 
     mycounters.Add(new Counter ("counter1")); 
     mycounters.Add (new Counter ("counter2")); 
     mycounters [2] = mycounters [0]; 

     for (int i = 0; i < 4; i++) { 

      mycounters[0].increment(); 

     } 

     for (int i = 0; i < 9; i++) { 
      mycounters[1].increment(); 

     } 

     PrintCounters (mycounters); 
     mycounters [2].reset(); 
     PrintCounters (mycounters); 
    } 

} 

, так как я исправил все, в то время как я отладка программы, там отметить шоу до enter image description here

и это мой файл класса, нет никакой ошибки.

namespace Counter 
{ 
public class Counter 
{ 
    private int _count; 
    public int Count 
    { 
     get{ 
      return _count; 

     } 


    } 
    private string _name; 
    public string Name 
    { 
     get { 
      return _name; 
     } 

     set{ 
      _name = value; 
     } 

    } 

    public Counter (string name) 
    { 
     _name = name; 
     _count = 0; 

    } 

    public void increment() 
    { 
     _count++; 
    } 

    public void reset() 
    { 
     _count = 0; 
    } 




} 

}

+0

Ваш метод 'PrintCounters' требует наличия массива' Counter', вы пытаетесь вызвать его с помощью одного экземпляра счетчика (myCou nter [0] == первый элемент вашего списка 'mycounters': что вы хотите напечатать? весь список или только первый элемент? –

ответ

2

Ожидается, что не будет работать, так как единственный аргумент, который PrintCounters ожидает представляет собой массив объектов счетчика, Counter[]. Вы можете просто изменить тип аргумента на IEnumerable<Counter>. Это будет работать.

Еще один способ решить вашу проблему - создать массив на основе списка, который вы вызываете, вызывая метод ToArray, а затем передайте это как аргумент PrintCounters.

PrintCounters(mycounters.ToArray()); 

Однако, я бы предпочел первый подход, поскольку он более общий. Как правило, это хорошая практика программирования в интерфейсе, а не в реализации. Подумайте об PrintCounters, что на самом деле делает. Он просто хочет перебирать предметы из коллекции Counter объектов и просто печатать для каждого элемента, это Name и Count. Это вообще имеет значение, если это массив или список или что-то еще? Единственное, что мы хотим, это перечислитель, чтобы повторять мысли об элементах. Итак, какова предпосылка для этого? Единственным предварительным условием является тип, который пройдет в PrintCounters, будет реализовывать IEnumerable<Counter>. Если один раз мы пройдем List<Counter>, а затем передумаем, и мы хотим передать Counter[], нам не нужно ничего менять в методе PrintCounters, потому что мы следовали этому принципу!

+0

Я новичок в программировании, поэтому извините за следующий вопрос. как я могу изменить тип аргумента, следует ли это изменить в printcounters или мне нужно исправить его в моем классе? –

+0

Вам не нужно просить об этом ... Это должно быть изменено в подписи метода: public static void PrintCounters (IEnumerable ). – Christos

+0

Я просто следил за тем, что вы сказали, чтобы изменить тип, но все еще есть ошибка на 'printcounter (mycounter [0]); «наилучшее перегруженное соответствие метода для« Counter.mainclass.PrintCounters (system.collection.generic IEnumerable ) »содержит некоторые аргументы invaild. –

0

Если Вы проезжали параметр в функции с помощью индексации ИЭ mycounters [0] затем определение функции необходимо изменить как этот

public static void PrintCounters(Counter counter) 
    { 
     Console.WriteLine("{0} is {1}", counter.Name, counter.Address); 
    } 

Или Если Вы хотите передать весь mycounters список в качестве параметра, то

public static void Main (string[] args) 
    { 
    List<Counter> mycounters = new List<Counter>(); 
    mycounters.Add(new Counter ("counter1")); 
    mycounters.Add (new Counter ("counter2")); 
    mycounters [2] = mycounters [0]; 

    for (int i = 0; i < 4; i++) { 

     mycounters[0].increment(); 

    } 

    for (int i = 0; i < 9; i++) { 
     mycounters[1].increment(); 

    } 

    PrintCounters (mycounters); 
    } 
public static void PrintCounters(IEnumerable<Counter> counters) 
    { 
     foreach (Counter c in counters) 
     { 
      Console.WriteLine("{0} is {1}", c.Name, c.Address); 

     } 
    }