2011-05-26 11 views
10

I tienen un menú desplegable multiselect llamado ID que sostiene ID = 1,2,3 cual necesito analizado en una matriz de enteros para hacer un Contiene() en en un método de filtro . En este momento yo uso:Parse int [] de "1,2,3"

string[] ids = Request["ID"].Split(','); 

Lo que realmente no me gusta porque es más lento para comparar cadenas que int. ¿Alguna sugerencia?

Respuesta

13
Request["ID"].Split(',').Select(x=>int.Parse(x)).ToArray(); 

Por supuesto, esto arrojará si cualquiera de las cadenas numéricas resultantes no son "parseables" (¿existe tal palabra?).

+10

puede simplificar, por cierto; 'Request [" ID "]. Split (','). Select (int.Parse) .ToArray();', o incluso 'Array.ConvertAll (Request [" ID "]. Split (','), int .Parse) ' –

2

Depende de la cantidad de veces que se verá en la matriz si la conversión a enteros son más rápidos o la comparación de cadenas es más rápido.

HashSet<int> ids = new HashSet<int>(from s in Request["ID"].Split(',') 
            select int.Parse(s)); 

Pero, probablemente, el más rápido si tiene muchos id: s será la creación de un HashSet<string>:

HashSet<string> = new HashSet<string>(string[] ids = Request["ID"].Split(',')); 
1

Primero:

string[] arr = Request["ID"].Split(',') 

continuación:

Array.ConvertAll(arr, s => Int32.Parse(s)); 
Array.ConvertAll(arr, Int32.Parse); 

arr.Select(s => Int32.Parse(s)); 
arr.Select(Int32.Parse); 

Entonces:

new HashSet<int>(result); 

(el contenedor más rápido para realizar Contains())

Ver también:

2
int[] ids = Request["ID"].Split(',').Select(Convert.ToInt32).ToArray(); 
+1

o' .Select (Convert.ToInt32) ' – Random832

+0

@Random: +1 Sí, eso es aún más conciso. Cambiaré la respuesta para reflejarlo. –

0

Si usted no tiene LINQ , puedes:

string[] ids = Request["ID"].Split(','); 
int[] items = new int[ids.Length]; 
for(int i = 0; i<ids.Length; i++) 
{ 
    items[i] = int.Parse(ids[i]); 
} 
+3

Para información, esas últimas 4 líneas son simplemente: 'int [] items = Array.ConvertAll (ids, int.Parse);' –

+0

¡Excelente, avanzando para el escaneo sigma! (Buzz Lightyear). – Valentin