2009-08-05 4 views
0

mein Problem ist, wie folgt:, wie mehr Objekte erstellen und sie in C# aufzuzählen

Im eine Konsolenanwendung bauen, die den Benutzer für die Anzahl von Objekten fragen sollte es schaffen und 4 Variablen, die für jeden zugeordnet werden müssen Objekt. Der neue Objektname sollte eine Zählnummer enthalten, beginnend mit 1.

Wie würden Sie das lösen? Ich denke über eine Klasse nach, bin mir aber nicht sicher, wie ich die Objekte in Runtime von userinput erstellen kann. Ist eine Schleife der beste Weg zu gehen?

Welche Art von Klasse, Struktur, Liste, Array .... würden Sie empfehlen. Die Variablen im Objekt sind immer vom selben Typ, aber ich muss sie richtig benennen, damit ich Methoden schreiben kann, um Operationen in einer späteren Phase des Programms auszuführen.

Ich lerne gerade die Sprache und wäre sehr dankbar für einen Rat, wie ich mein Problem angehen kann.

+2

Das duftet nach Hausaufgabenproblem –

+1

@Doug R: Evtl. hat er die Problemaussage aber nicht kopiert/eingefügt - das scheint eher sein Versuch einer Lösung zu sein. Die Sache ist, ich verstehe nicht, was er versucht oder warum. @Daniel: Möchten Sie eine Klasse eines bestimmten Typs dynamisch instanziieren, indem Sie die Eingabe des Benutzers für den Typnamen verwenden, oder möchten Sie, dass der Benutzer basierend auf der Eingabe des Benutzers einen neuen Typ erstellen kann? Wenn du einen neuen Typ erstellst ... was machst du danach? Ehrlich gesagt, scheint dies eine übermäßig komplexe Lösung für ein wahrscheinlich einfaches Problem zu sein. – Randolpho

+3

Hausaufgabenfragen sind in Ordnung, solange sie nicht von der "Hier ist ein Problem, gib mir eine Antwort" -Sorte sind. –

Antwort

3

Wenn ich Ihr Problem richtig verstehe:

class MyClass 
{ 
    public int ObjectNumber { get; set; } 
    public string SomeVariable { get; set; } 
    public string AnotherVariable { get; set; } 
} 

// You should use keyboard input value for this 
int objectsToCreate = 10; 

// Create an array to hold all your objects 
MyClass[] myObjects = new MyClass[objectsToCreate]; 

for (int i = 0; i < objectsToCreate; i++) 
{ 
    // Instantiate a new object, set it's number and 
    // some other properties 
    myObjects[i] = new MyClass() 
    { 
     ObjectNumber = i + 1, 
     SomeVariable = "SomeValue", 
     AnotherVariable = "AnotherValue" 
    }; 
} 

Das nicht ganz das tun, was Sie beschrieben. Add in Tastatureingabe und Sachen :) Die meisten dieser Code muss in einer Art von Main Methode, um tatsächlich zu laufen, etc.

In diesem Fall habe ich eine class gewählt, um Ihre 4 Variablen zu halten. Ich habe nur 3 implementiert, und ich habe sie als Eigenschaften, anstatt Felder implementiert. Ich bin mir nicht sicher, ob das für deinen Auftrag notwendig ist, aber es ist generell eine gute Angewohnheit, keine öffentlich zugänglichen Felder zu haben, und ich möchte nicht derjenige sein, der dir schlechte Gewohnheiten beibringt. Siehe auto-implemented properties.

Sie erwähnten eine struct, die auch eine Option wäre, je nachdem, was Sie darin speichern möchten. Im Allgemeinen wäre eine Klasse jedoch eine sicherere Wette.

Eine Schleife wäre in der Tat der Weg, um Ihre Objekte zu initialisieren. In diesem Fall ist eine for Schleife am praktischsten. Es beginnt bei 0 zu zählen, da wir die Objekte in einem Array platzieren und Array-Indizes in C# immer bei 0 beginnen. Das bedeutet, dass Sie i + 1 verwenden müssen, um der Objektnummer zuzuweisen, oder die Objekte werden wie ihre Indizes im Array von 0 bis 9 nummeriert.

Ich initialisiere die Objekte mit object initializer syntax, die in C# 3.0 neu ist. Die altmodische Art und Weise wäre sie eins nach dem anderen zu vergeben:

myObjects[i] = new MyClass(); 
myObjects[i].ObjectNumber = i + 1; 
myObjects[i].SomeVariable = "SomeValue"; 

Alternativ können Sie eine constructor für MyClass definieren könnte, die drei Parameter übernimmt.

Eine letzte Sache: einige Leute hier gepostet Antworten, die eine generische Liste (List<MyClass>) anstelle eines Arrays verwenden. Das wird gut funktionieren, aber in meinem Beispiel wählte ich die einfachste Form, die Sie verwenden könnten. Eine Liste hat im Gegensatz zu einem Array keine feste Größe (beachten Sie, wie ich das Array initialisiert habe). Listen sind großartig, wenn Sie später weitere Artikel hinzufügen möchten oder wenn Sie vorher nicht wissen, wie viele Artikel Sie speichern müssen. In diesem Fall haben wir jedoch die Tastatureingabe, so dass wir genau wissen, wie viele Artikel wir haben werden. Also: Array. Es wird implizit jedem, der Ihren Code liest, sagen, dass Sie nicht beabsichtigen, später weitere Elemente hinzuzufügen.

Ich hoffe, dies beantwortet einige Fragen und hob einige neue auf. Schau mal wie tief das Kaninchenloch geht: P

+0

Vielen Dank! –

0

Verwenden Sie eine Liste oder ein Array. Liste Beispiel:

int numberOfObjects = 3; 
List<YourType> listOfObjects = new List<YourType>(); 
for(int i = 0 ; i < numberOfObjects ; i++) 
{ 
    // Get input and create object .... 
    // Then add to your list 
    listOfObjects.Add(element); 
} 

Hier listOfObjects ist eine generische Liste, die eine variable Anzahl von Objekten des Typs Yourtype enthalten. Die Liste wird automatisch skaliert, sodass die Anzahl der hinzugefügten Objekte beibehalten werden kann. Hoffe das hilft.

+0

Eigentlich klingen mehr wie ein 'Dictionary ' (für eine benutzerdefinierte Klasse foo) mit der "name" -Anforderung. – annakata

+0

Ich bin nicht sicher, ob das eine tatsächliche Anforderung ist, oder nur, weil er mit dem Konzept von Arrays komfortabler werden muss. – Thorarin

0

Wenn ich verstehe, was Sie fordern Sie wahrscheinlich so etwas wie dies tun könnten:

class Foo 
{ 
    private static int count; 
    public string name; 
    public Foo(...){ 
    name = ++count + ""; 
    } 
} 
+0

Ich habe darüber nachgedacht, aber ich dachte, es wäre besser, ein solches Muster an dieser Stelle zu entmutigen. Wenn Sie absolut sicher gehen wollen, dass kein Objekt die gleiche Nummer/den gleichen Namen hat, können Sie es so erzwingen. Dann sollten Sie in diesem Fall wahrscheinlich eine "volatile" zu Ihrer statischen Variable hinzufügen. – Thorarin

0

Ich vermute, was Sie hier zu tun versuchen, aber das ist ein Stich in der Dunkelheit. Das Problem, das ich habe, beschäftigt sich mit dem ganzen "der neue Gegenstandsname sollte eine Zählnummer enthalten, die von 1 beginnt" Ding. Wie auch immer, hier ist mein Versuch:

public class UserInstantiatedClass 
{ 
    public int UserSetField1; 
    public int UserSetField2; 
    public int UserSetField3; 
    public int UserSetField4; 
    public string UserSpecifiedClassName; 
} 

public static class MyProgram 
{ 
    public static void Main(string [] args) 
    { 
     // gather user input, place into variables named 
     // numInstances, className, field1, field2, field3, field4 
     List<UserInstantiatedClass> instances = new List< UserInstantiatedClass>(); 
     UserInstantiatedClass current = null; 
     for(int i=1; i<=numInstances; i++) 
     { 
     current = new UserInstantiatedClass(); 
     current.UserSpecifiedClassName = className + i.ToString(); // adds the number 1, 2, 3, etc. to the class name specified 
     current.UserSetField1 = field1; 
     current.UserSetField2 = field2; 
     current.UserSetField3 = field3; 
     current.UserSetField4 = field4; 
     instances.Add(current); 
     } 
     // after this loop, the instances list contains the number of instances of the class UserInstantiatedClass specified by the numInstances variable. 
    } 
} 
Verwandte Themen