2012-01-10 12 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>(); 

Temp'yi ids içine yüklemem gerekiyor. Bir for döngüsü kullanabilirim ama eminim ki daha iyi bir yol var.virgülle ayrılmış bir sayının Listeye kaydedilmesi <int> C#

+1

Temp dizisinin boyutunu bildiğinizden, iç diziyi yeniden boyutlandırmak için listenizi bu boyuta sıfırlayın. Ve "daha iyi", daha az kod demek? A For Loop, sonunda nasıl uygulanacağıdır. – Bengie

+0

olası bir kopyası [Bir liste nasıl oluşturulur virgülle ayrılmış bir dizeden?] (Http://stackoverflow.com/questions/910119/how-to-create-a-listt-from-a-comma-separated-string) –

+0

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

cevap

24

Sen LINQ kullanabilirsiniz:

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

+1 - "Kullanabileceğiniz bir cevap yazıyordum" LINQ: " – davisoa

+0

+1 - Cevabın LINQ kullanacağını biliyordum, ama birilerinin yazmasını bekledim :) –

+2

@Anders: Bu sadece güzeldi, yeni bir lambda yaratmaya gerek yok," int.Parse() 'yöntemi delege uyar. –

1

Belki ids.AddRange(temp) gibi bir şey kullanmalısınız, bunu denedin mi?

+0

Liste .AddRange dizi dizisini kabul ediyor mu? –

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

Linq Büyük ve hepsi, ancak kendi üzerinde biraz daha az yığın-dayak ile bunu ve kabul edilebilir ne bulmak girişi üzerinde daha fazla kontrole sahip. Aşağıdaki, virgülle ayrılmış ve tüm beyaz alanı göz ardı eden herhangi bir karakter sayımından tamsayılar verecektir.

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; 
} 

Sonra List<int> kurucu kullanarak kolayca yeterince ints koleksiyonunuzu doldurabilirsiniz:

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

Sadece bununla ne yapmak niyetinde bağlıdır, ne sıklıkta ve ne kadar büyük girdi olacak olmak. Seyrek olarak ayrıştırılan küçük diziler için zaten kabul ettiğiniz Linq yöntemini kullanırdım. Daha yüksek hacimler için bunu yerine deneyebilirsiniz.

İlgili konular