Virgülle ayrılmış dizeyi bir Listeye nasıl dönüştürebilirim <int>


Yanıtlar:


436

İşte bunu yapmanın bir yolu:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

11
Bu da olabilirList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog

2
İçin bir ihtiyaç var mı new List<>?
LiquidPony

2
@LiquidPony no; ToList()bunun yerine arayabilirsin ; sonuç esasen aynıdır: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); Yine de, bir veya diğerini yapmanız gerekir, çünkü dönüş değeri Select()bir IEnumerable<>, ancak değilList<>
phoog

Bu uygulamada @LiquidPony evet Select, bu durumda uzantı geri döner IEnumerable<Int32>ve liste değildir. Ancak listenin başka bir koleksiyonu kaynak olarak kabul eden bir kurucu vardır.
Oybek

8
Etiketlerin boş bir dize olduğu vakayı ele almak içinSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

25

Basit bir doğrulama eklemek ve geçersiz değerleri atlamak istiyorsanız (istisna atmak yerine), TryParse kullanan bir şey:

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

EDIT: İşte Antoine tarafından geribildirim dayalı güncellenmiş bir sorgu. Kötü değerleri filtrelemek için önce TryParse'ı, sonra da gerçek dönüşümü yapmak için Ayrıştır'ı çağırır.

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5

Edit 2: Charles Burns'ün geri bildirimi sayesinde C # 7.0 için güncellenmiş bir sorgu. Bu yaklaşımla ekstra mos değişkeninden kurtulduğumuza dikkat edin, bu yüzden biraz daha temiz.

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();

1
0 tek bir girişse başarısız olur!
Antoine Meltzheim

2
C # 7.0 ile mos bildirisini atlayabilir ve TryParse çağrısını değiştirebilirsinizint.TryParse(m, out int _)
Charles Burns

14

W / Sen LINQ kullanabilirsiniz int.Parse()dönüştürmek için string[]bir etmek IEnumerable<int>ve sonra bu sonuca geçmesi List<T>yapıcı:

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));

8

Küçük bir LINQ uzun bir yol kat ediyor:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();

6

LINQ Sorgusu olmadan, bu yöntemi seçebilirsiniz,

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

ve sonra bu Listeyi tamsayı tipine dönüştürebilirsiniz ...


tanıdık olmayan birine sadece bir not = .ToList<string>()hala ihtiyaçusing System.Linq;
Bill Rawlinson


2

C # 3.5 kullanıyorsanız bunu başarmak için Linq kullanabilirsiniz.

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

ya da kısa olan

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();

2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

1

Khalid13'ün cevabında bir değişiklik yaptım. Kullanıcı "0" dizesini koyarsa, yanıtı sonuç listesinden kaldırır. Benzer bir şey yaptım ama anonim bir nesne kullandım.

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtection, dizenin boş olup olmadığını koruyan özel bir işlevdir.

Yukarıdakilerin yaptığı, hatasız dönüştürülemeyen dizeleri çıkarmaktır. Dönüşümle ilgili bir sorun varsa hata yapmanız gerekiyorsa, kabul edilen cevap hile yapmalıdır.


1

Bunu tökezledim ve linq olmadan kendi çözümümü paylaşmak istiyorum. Bu ilkel bir yaklaşımdır. Tamsayı olmayan değerler de listeye eklenmez.

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

Bu yardımcı olur umarım.


-2

Basit. Önce dizeyi bölün. Virgül (,) 'den sonra boş alanı kesin. Ardından ToList () tanımlı sistem kullanın

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

',' İşaretinden sonraki boşluğu kaldırmak ve virgülle ayrılmış bu metni Liste'ye dönüştürmek için

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.