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.