2016-04-10 13 views
1

PrintCounters() yöntemini kullanarak mycounters[0] yöntemini yazdırmaya çalışıyorum, ancak PrintCounters(mycounters[0]) çalışmıyor gibi görünüyor, bir sözdizimi sorunu mu? Ben programı hata ayıklama sırasında, orada enter image description herePrintCounters() çağrısı yürütmüyor, neden?

gösterileri belirterek ve bu benim sınıf dosyası olduğu, her şeyi sabit beri

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); 
    } 

} 

, hiçbir hata yoktur.

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 'yönteminiz bir' Counter' dizisi gerektirir, tek bir Örnekle çağırmaya çalışıyorsunuz (myCou nter [0] == "mycounters listenizin ilk öğesi): ne yazdırmak istiyorsunuz? tüm liste ya da sadece ilk eleman? –

cevap

2

O PrintCounters beklediği Sayaç nesnelerinin, Counter[] dizisi olduğu tek argüman beri, işe yaramaz beklenmektedir. Bağımsız değişken türünü IEnumerable<Counter> olarak değiştirebilirsiniz. Bunu yapmak, işe yarayacak.

Sorununuzu çözmenin bir başka yolu ise, ToArray yöntemini çağırarak, Listeye dayalı bir dizi oluşturmak ve bunu PrintCounters numaralı ada göre bir argüman olarak iletmektir.

PrintCounters(mycounters.ToArray()); 

Bununla birlikte, daha genel olduğu için ilk yaklaşımı tercih ederim. Genel olarak, bir uygulamada değil, bir arayüzde programlamak için iyi bir uygulamadır. Gerçekte ne olduğunu PrintCounters düşünün. Sadece nesnelerinin bir koleksiyonunun öğeleriyle yinelemek ve sadece Name ve Count her öğe için yazdırmak istiyor. Bu bir dizi mi yoksa bir liste mi, yoksa neyse mi? İstediğimiz tek şey, düşünceyi tekrarlamak için bir sayımdır. Peki bunun için ön koşul nedir? Tek ön koşul, PrintCounters'da geçen türün, IEnumerable<Counter>'u uygulayacağı türdür. Bir kez bir List<Counter>'u geçip aklımızı değiştirirsek ve bir Counter[]'u geçmek istiyorsak, PrintCounters yöntemindeki herhangi bir şeyi değiştirmek zorunda kalmayacağız çünkü bu prensibi takip ettik! Sen indeksleme ie kullanarak fonksiyonunda parametre geçirerek olsaydı

+0

Programlamada yeni, aşağıdaki soru için çok üzgünüm. argümanın türünü nasıl değiştirebilirim, bu printcounter'larda değiştirilmeli mi yoksa sınıfımda düzeltmem mi gerekiyor? –

+0

Özür dilemene gerek yok ... Bu yöntem imzanın "public statik void PrintCounters" (IEnumerable counters) 'ile değiştirilmelidir. – Christos

+0

Sadece türünü değiştirmek istediğimi takip ettim ama 'printcounter (mycounter [0])' da hala bir hata var; 'Counter.mainclass.PrintCounters (system.collection.generic IEnumerable )' için en iyi aşırı yüklenmiş yöntem eşleştirmesi bazı invaild argümanlarına sahiptir. –

0

mycounters [0] sonra Fonksiyon tanımı bu

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

gibi değiştirmeniz gerekir Veya Daha sonra parametre olarak

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); 
    } 
bütün mycounters listesini iletmek isterseniz
public static void PrintCounters(IEnumerable<Counter> counters) 
    { 
     foreach (Counter c in counters) 
     { 
      Console.WriteLine("{0} is {1}", c.Name, c.Address); 

     } 
    } 
İlgili konular