2009-05-08 7 views
1

Ich habe eine Klasse wie diesesLINQ2SQL: Wie deklariere ich eine Elementvariable vom Typ Var?

public class foo 
    { 

     private void getThread() 
     { 
     var AllThreads = from sc in db.ScreenCycles 
          join s in db.Screens on sc.ScreenID equals s.ScreenID 
          select s; 
     } 
    } 

ich die AllThreads Variable eine Klassenvariable anstelle einer Methode Variable machen wollen. Wie folgt ...

public class foo 
{ 
    var AllThreads; 
    private void getThread() 
    { 
     AllThreads = from sc in db.ScreenCycles 
          join s in db.Screens on sc.ScreenID equals s.ScreenID 
          select s; 
    } 
} 

Wie auch immer ich eine Klassenvariable vom Typ Var deklarieren lassen werde.

Wie erreiche ich das?

+1

Es gibt nicht so etwas wie „Typ var“, weil var nicht eigentlich eine Art ist - es ist ein Schlüsselwort ist, dass der Compiler sagt: „Sie herausfinden, welche Art hier zu setzen, weil ich Ich habe bessere Dinge zu tun. " –

Antwort

1

Ihren Original-Code zu erhalten, versuchen Sie dieses

public class foo 

    IEnumerable<ScreenCycles> AllThreads; 
    private void getThread() 
    { 
     AllThreads = from sc in db.ScreenCycles 
          join s in db.Screens on sc.ScreenID equals s.ScreenID 
          select s; 
    } 

} 
+0

Sieht so aus, als würde er "Screens" anstatt "ScreenCycles" auswählen –

+0

Lohnt es sich, darauf hinzuweisen, dass das ursprüngliche Klassen-Design fehlerhaft ist und Sie sollten IEnumerable normalerweise nicht zurückgeben? Zugegeben, genau das, was Sie geantwortet haben, gilt für die gestellte Frage, aber am Ende ist der Rat grundsätzlich fehlerhaft (als direktes Ergebnis der Frage). – Serapth

+0

Ich konnte nicht mehr widersprechen.Im Allgemeinen sollten Sie IEnumerable zurückgeben, es sei denn, Sie haben einen guten Grund, einen weniger generischen Typ zurückzugeben. Es ist jedoch wahrscheinlich keine so gute Idee, ein IEnumerable zu speichern, das von einer Live-Datenbankverbindung abhängig ist, ohne zuerst ToArray oder ToList aufzurufen. –

2

Man könnte es wie folgt tun:

public class foo {  
    IEnumerable<string> AllThreads;  

    private void getThread() { 
    AllThreads = (from sc in db.ScreenCycles 
         join s in db.Screens on sc.ScreenID equals s.ScreenID 
         select s.Screen1 + " " + sc.Thread); 
    } 
} 

pro Vorschlag Joel aktualisiert.

+0

Schließen, aber es ist am besten, die .ToList() zu vermeiden. –

+0

Außerdem glaube ich nicht, dass er Strings zurückbringt. –

+0

ah, er änderte die Frage ... sonst hätte ich das selbe gemacht wie @The Lame Duck –

0

Die ursprüngliche Variable definiert eine anonyme Klasse. Um zu tun was du hast, musst du die Klasse definieren.

Aber ... Sie könnten wahrscheinlich dies nur tun:

List<string> AllThreads; 
1

var nur als lokale Deklaration verwendet werden kann. Wenn Sie den von einem LINQ-Ausdruck zurückgegebenen Typ verwenden möchten, müssen Sie ein Objekt erstellen.

0

Sie nicht var auf Klassenebene verwenden können. Sie müssen einen expliziten Typ angeben, wenn er nicht sofort initialisiert wird.

Unter der Annahme, "s" ist von einem Typ Namen "Screen":

public class foo 
{ 
    IEnumerable<Screen> AllThreads; 
    private void getThread() 
    { 
     AllThreads = from sc in db.ScreenCycles 
          join s in db.Screens on sc.ScreenID equals s.ScreenID 
          select s; 
    } 
} 
0

Wie viele den man nicht var verwenden kann. Refactorieren Sie Ihren Code, um Linq-Typen zu verwenden.

public class foo 
{ 
    ScreenCycle[] allThreads; 
    private void getThread() 
    { 
     allThreads = (from sc in db.ScreenCycles join s in db.Screens on sc.ScreenID 
        equals s.ScreenID select s).ToArray(); 
    } 
} 
0

OK, das ist keine Antwort, nur ein relativer Neuling zur Stackoverflow-Frage, die dieser Thread recht gut illustriert.

Die Code-Markup-Tools auf dieser Website sind ernst ... um, einzigartig. Was ich in diesem speziellen Fall nicht verstehe ist, warum sind all unsere Kommentarbausteine ​​sehr lang? Ist es etwas, was das OP getan hat? Ich habe verschiedene Änderungen an meinem früheren Beispiel gemeistert, und aus irgendeinem Grund war das Textfeld, in dem sich mein Code befand, viel länger als sein Inhalt. (IE 8)

Verwandte Themen