2010-09-10 33 views
7

Mattino.Come si usa una stringa come indice?

Edizione:
Ho una classe denominata Rapporti. Due costruttori. Uno non consente parametri, l'altro un array di stringhe. Gli array di stringhe dovrebbero essere i report che vorrebbero visualizzare. Quello che mi piacerebbe fare è la seguente:

string strSQL = this.Queries[strReportName]; 

Ho la sensazione che sia possibile perché nel dataGridView che sto utilizzando, ottengo l'indice di colonna da:

int nColumnIndex = dgvParts.Columns[strColumnName].Index; 

Sia di coloro che gli esempi usano una stringa per determinare quale valore nella matrice essi recuperano, ma non sono sicuro di come farlo. Qualcuno può darmi un aiuto? Qualsiasi aiuto è apprezzato.

Per gli editor e le mod: Sì, i report si collegano liberamente con l'altro post che ho sul caricamento dinamico delle DLL, ma vorrei mantenere ancora aperto l'altro. Il mio capo e io abbiamo deciso per il breve termine, avremo una sola DLL e tutto è codificato, ma a lungo termine vogliamo fare cadere dinamicamente le DLL come report, quindi per favore non etichettatelo come duplicato. Ho in programma questo fine settimana per cercare di implementare i metodi che mi sono stati dati nell'altro thread. Grazie.

Edit - parte 2 della domanda: Ok, ecco la mia classe come è adesso:

public class Queries 
{ 
    #region Report Queries 
    #region Missing Code 
     string strMissingCode = "SELECT * FROM PARTS WHERE CODE IS NULL OR CODE = ''"; 
    #endregion 
    #endregion 
} 

mi piacerebbe cambiarlo in qualcosa di simile:

public class Queries : Dictionary<string, string> 
{ 
} 

Ma non voglio che debbano usare un costruttore per istanziarlo. Voglio statica di sorta in modo da poter eseguire codice come questo:

class Reports 
{ 
    private List<ReportRecord> _lstRecrods = new List<ReportRecord>(); 
    public List<ReportRecord> Records { get { return _lstRecords; } } 

    public Reports(string[] strDisplayedReports) 
    { 
    foreach (string strReportTitle in strDisplayedReports) 
    { 
     this.BuildReportList(strReportTitle); 
    } 
    } 

    private void BuildReportList(string strReportTitle) 
    { 
    using (DataSet ds = Database.GetDataSet(Queries[strReportTitle])) 
    { 
     ... 
    } 
    } 
} 

Come faccio a farlo statica di sorta per cui non devo istanziare query? Grazie ragazzi e ragazze.

+1

Gli indicizzatori statici non sono (per nessun motivo particolarmente valido) non consentito. http://stackoverflow.com/questions/154489/are-static-indexers-not-supported-in-c – spender

+0

lol. Stavo solo leggendo un thread che lo coinvolge su un altro sito a riguardo. Sembrava che l'avesse risolto, ma se lui dice di no qui, allora è no. Dern. :) Grazie. – XstreamINsanity

risposta

9

A Dictionary può utilizzare le stringhe come "indice" (chiave, in realtà).

+0

Grazie, questo è quello con cui andrò. Non ho nemmeno pensato di guardare i dizionari. Precaricalo. – XstreamINsanity

+0

Assicurati di contrassegnare come risposta. –

+0

@Ryan - Stavo per farlo, ma ho un'altra parte della domanda che dovevo aggiungere. Se non ottengo nulla di cui ho bisogno dalla seconda parte, contrassegnerò questa risposta. Grazie. – XstreamINsanity

0

this.Queries.SingleOrDefault (x => x.Name == strReportName) non avrebbe funzionato? In caso contrario, è possibile creare un metodo di estensione che nasconderebbe questo codice in un indicizzatore []

-2

le matrici di base in C# sono basate su indice e non possono utilizzare gli accessi di stringa.

Questo funziona:

string[] someArray = {"query 1", "query 2"}; 
string myQuery = someArray[1]; 

Questo non lo fa:

myQuery = someArray["some value"]; 

utilizzare la classe Dictionary, che consente le chiavi di ogni tipo, tra cui tipi complessi.

13

Penso che tu sia alla ricerca di qualcosa di simile al seguente:

public class Reports 
{ 
    System.Collections.Generic.IDictionary<string,string> queries; 

    public string this[string key] 
    { 
     get 
     { 
      return this.queries[key]; 
     } 
    } 
} 

Vedi http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx per maggiori informazioni.

Se non è necessario aggiungere altre funzionalità alla classe Reports, utilizzare il dizionario solo come altri hanno pubblicato.

+1

+1 per menzionare la definizione del proprio operatore []. Maggiori informazioni qui: http://msdn.microsoft.com/en-us/library/6x16t2tx%28v=VS.80%29.aspx – spender

+1

+1 è la risposta che dice come implementare una stringa come operatore indice. Gli altri mostrano solo le altre classi che li hanno implementati. – Oliver

0

È possibile utilizzare Array.IndexOf (this.Queries, strReportName);