2012-01-10 9 views
6
string formIdList = "8256, 8258, 8362, 8120, 8270, 8271, 8272, 8273, 8257, 8279, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8219, 8231, 8232, 8233, 8234, 8235, 8242, 8248, 8251, 8252, 8254, 8255, 8262, 8263, 8264, 8265, 8266, 8290, 8292, 8293, 8294, 8300, 8320, 8230, 8227, 8226, 8225, 8224, 8223, 8222, 8221, 8291, 8261, 8241, 8228, 8220, 8211, 8208, 8207, 8206, 8205, 8204, 8203, 8202, 8201, 8153, 8151, 8150, 8130, 8122, 8000, 8101, 8102, 8103"; 

var temp = formIdList.Split(','); 

List<int> ids = new List<int>(); 

Necesito cargar la temperatura en los identificadores. Puedo usar un for-loop, pero estoy seguro de que hay una mejor manera.cómo cargar una coma separados por números en la lista <int> en C#

+1

Dado que conoce el tamaño de la matriz temporal, inicialice su lista a ese tamaño para reducir el tamaño de la matriz interna. Y con "mejor", ¿quieres decir menos código? A For Loop es cómo se implementará al final. – Bengie

+0

posible duplicado de [¿Cómo crear una lista a partir de una cadena separada por comas?] (Http://stackoverflow.com/questions/910119/how-to-create-a-listt-from-a-comma-separated-string) –

+0

> Simon Fox: var asIntegers = arr.Seleccione (s => int.Parse (s)); http://stackoverflow.com/questions/1297231/convert-string-to-int-in-one-string-of-code-using-linq – Bengie

Respuesta

24

Se podría utilizar LINQ:

string formIdList = ... 
List<int> ids = formIdList.Split(',').Select(int.Parse).ToList(); 
+1

+1 - Estaba escribiendo una respuesta que comenzó con "Podría usar LINQ: " – davisoa

+0

+1 - Sabía que la respuesta sería usar LINQ, pero estaba esperando que alguien lo escribiera :) –

+2

@Anders: Estuvo perfecto como estaba, sin necesidad de crear un nuevo lambda, el' El método int.Parse() 'encaja perfectamente con el delegado. –

1

tal vez debería usar algo como ids.AddRange(temp), ¿lo intentas?

+0

¿La lista .AddRange acepta una matriz de cadenas? –

2
List<int> ids = formIdList.Split(',').Select(i=>int.Parse(i)).ToList(); 
1

LINQ es grande y todo, pero hacer esto con un poco menos de lixiviación en golear por su cuenta y tener más control sobre lo que de entrada que encuentre aceptable. Lo siguiente arrojará los enteros de cualquier enumeración de caracteres separados por comas e ignorando todo el espacio en blanco.

public static IEnumerable<int> ParseInts(IEnumerable<char> idList) 
{ 
    bool valid = false; 
    int working = 0; 
    foreach (char c in idList) 
    { 
     if (c >= '0' && c <= '9') 
     { 
      valid = true; 
      working = (working*10) + (c - '0'); 
     } 
     else if (c == ',') 
     { 
      if(valid) 
       yield return working; 
      valid = false; 
      working = 0; 
     } 
     else if(!Char.IsWhiteSpace(c)) 
     { 
      throw new ArgumentOutOfRangeException(); 
     } 
    } 
    if (valid) 
     yield return working; 
} 

A continuación, puede llenar su colección de enteros con bastante facilidad mediante el uso de la List<int> constructor:

string formIdList = "8256, 8258, 8362"; 
List<int> ids = new List<int>(ParseInts(formIdList)); 

sólo depende de lo que piensa hacer con esto, con qué frecuencia y qué tan grande la entrada se ser. Para arreglos pequeños analizados con poca frecuencia, usaría el método Linq que ya había aceptado. Para volúmenes más altos puede probar esto en su lugar.

Cuestiones relacionadas