2010-08-10 54 views
8

我決定嘗試LINQ第一次嘗試並解決this question皮條客我的LINQ:基於另一篇文章的學習練習

我首次涉足LINQ的奇妙世界的結果是這樣的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> list = new List<string>() 
      { 
       "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(); 
     } 
    } 
} 

我想知道我怎麼能改善上述解決這個人爲的小例子。我對我是否使用了最好的驗證方法不感興趣,或者我可以如何本地化「Press Enter」或類似的東西;我只是想利用這個例子來學習更多關於LINQ的知識。

+2

+1對標題:} – 2010-08-10 11:30:25

+0

@serkan - 事實。有人需要帶出該書的標題 – Matt 2010-08-10 12:01:04

+0

這是一個陳詞濫調的喜劇短語再次滑稽 – 2010-08-10 12:09:48

回答

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

其中s.Count(x => x ==' - ')== 2 但是完全一樣。 – Toby 2010-08-10 11:17:56

+0

ahh這將是一個lambda表達式,然後 – 2010-08-10 11:18:12

+0

事實上,整個linq在編譯時轉換爲lambda。嘗試在反射器中查看它。 – nothrow 2010-08-10 11:23:45

4

它也可以使用Lambda表達式寫:

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

我更喜歡,因爲流利的接口的Lambda表達式在LINQ語法。恕我直言,這是更可讀的人類。

+0

流利的界面? – 2010-08-10 11:19:03

+0

ahh:http://stackoverflow.com/questions/214500/which-linq-syntax-do-you-prefer-fluent-or-query-expression – 2010-08-10 11:20:54

+0

通常,一個流暢的接口通過使用方法鏈來實現指令上下文隨後的通話。 (比這更多的參與,但它現在會做)在這種情況下調用Where方法,然後調用Select方法。 – heads5150 2010-08-10 11:23:13

4

我覺得這很不錯。部分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 
+0

不錯,但消耗的內存比.Substring變體多。 – nothrow 2010-08-10 11:28:19

+1

select var result = from s select String.Join(「」,s.Split(' - ')。Skip(2)); 不錯的主意,但它是鉤在紅鯡魚條目上(例如「xxxx」) – 2010-08-10 11:30:35

+0

@Yossarian是的,你是正確的。但它肯定比Reg exp快,我認爲它在句法上非常流暢。如果你想要儘可能快的速度,你應該適當地不使用LINQ,而是一種更迫切的方式。 – 2010-08-10 11:31:16

4

我Lambda表達式的忠實粉絲太...

static void Main(string[] args) 
    { 
     Func<string, char, int> countNumberOfCharsInString = 
      (str, c) => str.Count(character => character == c); 

     var list = new List<string>() 
     { "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(); 
    } 
4

我不認爲這是一種進步,因爲它的可讀性,但你可以使用一些在List類內置的方法做這一切在一個在線:

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

我個人覺得這很可怕,所以只是爲了興趣!

+0

但它很有趣!我的FindAll非常相似,很好用 – fletcher 2010-08-10 11:37:50

+0

只是爲了便於閱讀我會把「list.FindAll(s => s.ToCharArray()。 Where(c => c ==' - ')。Count()= = 2)「全部在一行上,但謝謝你,我的解決方案讓我想到了lambda和代表。想想我現在明白他們好一點了。 – 2010-08-10 11:43:59