2009-11-05 35 views
19

Bu kod:LINQ'deki değişkenleri nasıl tanımlarım?

txt 
txt 
txt 
doc 
xml 
xml 
html 
txt 
as 

Bu tanımladığınız daha karmaşık LINQ sorguları yüzden f.IndexOf('.') değişken emin olmak için bir yol var mı:

string[] files = {"test.txt", 
    "test2.txt", 
    "notes.txt", 
    "notes.doc", 
    "data.xml", 
    "test.xml", 
    "test.html", 
    "notes.txt", 
    "test.as"}; 

files.ToList().ForEach(f => Console.WriteLine(
     f.Substring(
      f.IndexOf('.') + 1, 
      f.Length - f.IndexOf('.') - 1 
      ) 
    )); 

bu listeyi üretir bir yer? Eğer o zaman bir satır içi değişkeni (aslında Linq kullanmıyor söz gönderilmiş kodu) tanımlamak için let anahtar kelime kullanabilirsiniz Linq kullanarak olsaydı

+0

. Örnek kod bir Lambda işlevi kullanıyor. İşlevsel olarak bazı çakışmalar var, ama aynı şeyler değiller. –

+0

Ve bu somut örnekte, yalnızca alt dizgi başlangıç ​​dizinini kabul eden Substring yüklemesini kullanabilirsiniz (http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.80%29.aspx) ve döndürür dizenin geri kalanı. – Groo

cevap

50

yapabilirdi.

var ext = from file in files 
      let idx = f.LastIndexOf('.') + 1 
      select file.Substring(idx); 

Ancak ben kendini dize Path.GetExtension kullanarak yerine ayrıştırma öneriyoruz gönderdiniz belirli senaryo için (dosya herhangi bir dosya adına . varsa örneğin, kod kıracak). Eğer söz dizimi from çeşit kullanmak istemiyorsanız

var ext = from file in files select Path.GetExtension(file).TrimStart('.'); 
foreach (var e in ext) 
{ 
    Console.WriteLine(e); 
} 
9

Bu

files.ToList().ForEach(f => { var i = f.IndexOf('.'); 
    Console.WriteLine(f.Substring(i + 1, f.Length - i - 1));} 
); 
2

, sen Select yöntemi ile benzer bir şey yapabilirsiniz:

var extensions = files 
     .Select(x => new { Name = x, Dot = x.IndexOf('.') + 1 }) 
     .Select(x => x.Name.Substring(x.Dot)); 

Greg gibi ben Path.GetExtension yöntemi kullanarak öneriyoruz rağmen .

var extensions = files 
     .Select(x => Path.GetExtension(x)); 

Ve bu durumda gerçekten önerdi linq deyimlerinden daha çok daha kolay olduğunu düşünüyorum: Ve yöntemlerle, yani böyle gibi olabilir. konsola yazmak için


, bunu yapabilirsiniz: Greg Beech söylediği gibi bu LINQ değil

extensions 
    .ToList() 
    .ForEach(Console.WriteLine); 
İlgili konular