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:
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.
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 ...
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();
Bu çalışıyor.
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
Eğer deniyorsan
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ı
Şimdi sırayı başkalarının önerdiği gibi açıkça tersine çevirebilirsiniz.