C # Sözdizimi - Dizeyi Virgülle Diziye Böl, Genel Listeye Dönüştür ve Ters Sırala


93

Bunun için doğru sözdizimi nedir:

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

Neyi berbat ediyorum? TSource ne anlama geliyor?

Yanıtlar:


254

Sorun şu ki List<T>.Reverse(), dönecek olanı arıyorsun void.

Ya yapabilirsin:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

veya:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

İkincisi daha pahalıdır, çünkü keyfi bir şekilde tersine çevirmek IEnumerable<T>, tüm verilerin arabelleğe alınmasını ve ardından hepsini vermeyi içerir - oysa List<T>tüm tersine çevirmeyi "yerinde" yapabilir. (Buradaki fark Enumerable.Reverse<T>(), List<T>.Reverse()örnek yöntemi yerine uzantı yöntemini çağırmasıdır .)

Daha verimli, şunları kullanabilirsiniz:

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

Bu, uygun olmayan boyutta tamponlar oluşturmayı önler - birinin yapılacağı yerde dört ifadeyi almak pahasına ... Her zaman olduğu gibi, gerçek kullanım durumunda okunabilirliği performansla tartın.


25
skeet bir canavar!
— flesh

2
iyi hazırlanmış, gerçekten minnettarım!
— Gaurav Aroraa

11

Bu sorunun oldukça eski olduğunun farkındayım, ancak benzer bir sorun yaşadım, ancak dizimde boşluklar vardı. Bir dizeyi virgülden daha fazlasıyla nasıl ayıracağını bilmesi gerekenler için:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

StringSplitOptions, yalnızca bir boşluk karakteri olacak kayıtları kaldırır ...


Sadece Tom yerine "Tom Cruise" olsaydı bu işe yaramaz
— alevlenir

4
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Bu çalışıyor.


2

Bunu dene:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();

Hatayı alıyorum - 'void' türü örtük olarak 'System.Collections.Generic.List'e dönüştürülemiyor <string>
— BuddyJoe

1

Burada eksik olan şey, .Reverse () bir void yöntemidir. .Reverse () sonucunu bir değişkene atamak mümkün değildir. Bununla birlikte, Enumerable.Reverse () kullanmak ve sonucunuzu almak için sırayı değiştirebilirsiniz.

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

Aradaki fark, Enumerable.Reverse () 'nin void return olmak yerine bir IEnumerable <T> döndürmesidir


1

Eğer deniyorsan

  1. Birden çok sınırlayıcı kullanın
  2. Boş dizeleri filtreleyin
  3. Baştaki / sondaki boşlukları kırp

aşağıdaki çalışmalıdır:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

Çıktı

  • Tom
  • Seyir
  • Scott
  • Bob
  • -de

Şimdi sırayı başkalarının önerdiği gibi açıkça tersine çevirebilirsiniz.

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.