2010-09-10 15 views
7

Mañana.¿Cómo se usa una cadena como índice?

Issue:
Tengo una clase llamada Informes. Dos constructores Uno no permite parámetros, el otro una matriz de cadenas. Se supone que el conjunto de cadenas son los informes que les gustaría mostrar. Lo que me gustaría hacer es la siguiente:

string strSQL = this.Queries[strReportName]; 

Tengo la sensación de que es posible porque en el dataGridView que estoy usando, me sale el índice de la columna por:

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

estos dos los ejemplos usan una cadena para determinar qué valor en la matriz recuperan, pero no estoy seguro de cómo hacerlo. ¿Alguien puede darme algo de ayuda? Cualquier y toda ayuda es apreciada.

Para los editores y las modificaciones: Sí, la parte de informes se relaciona de manera vaga con la otra publicación que tengo sobre la carga dinámica de archivos DLL, pero me gustaría mantener la otra abierta aún. Mi jefe y yo decidimos a corto plazo, solo tendremos una única DLL y todo estará codificado, pero a la larga queremos incluir dinámicamente las DLL como informes, así que no etiquetes esto como un duplicado. Planeo este fin de semana para tratar de implementar los métodos que me dieron en el otro hilo. Gracias.

Edición - Parte 2 de la pregunta: Ok, aquí está mi clase, ya que es en este momento:

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

me gustaría cambiarlo a algo como esto:

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

Pero no quiero que tengan que usar un constructor para crear una instancia. Quiero estática de tipo para que pueda ejecutar código como este:

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])) 
    { 
     ... 
    } 
    } 
} 

¿Cómo puedo hacer que estática de tipo a donde yo no tengo que crear una instancia de consultas? Gracias chicos y chicas.

+1

Los indexadores estáticos no están permitidos (sin ninguna razón particularmente buena). http://stackoverflow.com/questions/154489/are-static-indexers-not-supported-in-c – spender

+0

lol. Estaba leyendo un hilo que lo involucraba en otro sitio con respecto a esto. Parecía que lo había resuelto, pero si él dice que no, entonces es no. Dern it. :) Gracias. – XstreamINsanity

Respuesta

9

A Dictionary puede usar cadenas como el "índice" (clave, en realidad).

+0

Gracias, esto es lo que voy a hacer. Ni siquiera pensé en mirar Diccionarios. Preciate. – XstreamINsanity

+0

Asegúrese de marcar como la respuesta. –

+0

@Ryan - Iba a hacerlo, pero tengo otra parte en la pregunta que tuve que agregar. Si no obtengo nada de la segunda parte, le marcaré la respuesta. Gracias. – XstreamINsanity

0

this.Queries.SingleOrDefault (x => x.Name == strReportName) no funcionaría? De lo contrario, puede crear un método de extensión que oculte este código en un indexador []

-2

Las matrices básicas en C# se basan en índices y no pueden utilizar los descriptores de acceso de cadenas.

Esto funciona:

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

Esto no es así:

myQuery = someArray["some value"]; 

utilizar la clase Dictionary, lo que permite que las claves de cualquier tipo, incluyendo los tipos complejos.

13

pienso que usted está buscando algo como lo siguiente:

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

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

Ver http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx para obtener más información.

Si no necesita agregar más funcionalidades a su clase de Informes, entonces simplemente use el Diccionario que otros publicaron.

+1

+1 por mencionar definir el propio operador []. Más información aquí: http://msdn.microsoft.com/en-us/library/6x16t2tx%28v=VS.80%29.aspx – spender

+1

+1 esa es la respuesta que dice cómo implementar una cadena como operador de índice. Los otros solo muestran otras clases que los han implementado. – Oliver

0

Puede usar Array.IndexOf (this.Queries, strReportName);

Cuestiones relacionadas