皮条客我的LINQ:基于另一篇文章的学习练习

我决定第一次试用LINQ尝试解决这个问题 。

我第一次涉足LINQ精彩世界的结果如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { List list = new List() { "fred-064528-NEEDED1", "xxxx", "frederic-84728957-NEEDED2", "sam-028-NEEDED3", "-----", "another-test" }; var result = from s in list where (from c in s where c == '-' select c).Count() == 2 select s.Substring(s.LastIndexOf("-") + 1); foreach (string s in result) Console.WriteLine(s); Console.WriteLine("Press Enter"); Console.ReadLine(); } } } 

我想知道如何改进上述解决这个人为设计的小例子的方法。 我对是否使用了最好的validation方法,或者我如何本地化“按Enter”或类似的东西不太感兴趣; 我只是想使用这个例子来学习更多关于LINQ的知识。

 var result = from s in list where s.Count(x => x == '=') == 2 select s.Substring(s.LastIndexOf("-") + 1); 

它也可以使用Lambda表达式编写:

 var result = list.Where(s => (from c in s where c == '-' select c).Count() == 2).Select( s => s.Substring(s.LastIndexOf("-") + 1)); 

由于Fluent接口,我更喜欢Lambda表达式而不是LINQ语法。 恕我直言,它更具人性化。

我不认为这是一个改进,因为它不太可读,但您可以使用List类中的一些内置方法在一行中完成所有操作:

 list.FindAll(s => s.ToCharArray(). Where(c => c == '-').Count() ==2). ForEach(c => Console.WriteLine(c.Substring(c.LastIndexOf("-") + 1))); 

就个人而言,我觉得这很可怕,所以只是为了兴趣!

我认为这非常好。 部分LINQ。

 var result = String.Join("-", inputData.Split('-').Skip(2)); 

如果在前两个之后不能有任何’ – ‘那么这将(不是LINQ):

 var result = inputData.Split('-')[2]; //If the last part is NEE-DED then only NEE is returned. And will fail on wrong input 

我也是Lambdas的忠实粉丝……

  static void Main(string[] args) { Func countNumberOfCharsInString = (str, c) => str.Count(character => character == c); var list = new List() { "fred-064528-NEEDED1", "xxxx", "frederic-84728957-NEEDED2", "sam-028-NEEDED3", "-----", "another-test" }; list.Where(fullString => countNumberOfCharsInString(fullString,'-') == 2) .ToList() .ForEach(s => Console.WriteLine(s.Substring(s.LastIndexOf("-")+1))); Console.WriteLine("Press Enter"); Console.ReadLine(); }