2014-02-13 86 views
0

終於開始學習LINQ了。我想將字符串轉換爲對象。我知道還有其他方法,但我想看看它是如何使用LINQ完成的。這是我想出來的最好的方式:從逗號分隔的字符串中使用linq的對象

using System; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     string [] lines = new string[2]; 
     lines[0] = "John, 12345, true"; 
     lines[1] = "Miles, 45678, true"; 

     var o = from x in lines 
       select new { 
        name = x.Split(',')[0], 
        zip = Int32.Parse(x.Split(',')[1]), 
        status = bool.Parse(x.Split(',')[2]) 
       }; 
     foreach (var p in o) { 
      Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status); 
     } 
    } 
} 

我的問題是:有沒有使用所有這些Split()一個更好的方法?這是一個小提琴:http://dotnetfiddle.net/RSY48R

+0

你可能想看看LinqToCSV項目,https://github.com/mperdeck/LINQtoCSV –

+1

這感覺有點像一個http:// codereview.stackexchange.com/問題 – Liam

+4

這個問題似乎是無關緊要的,因爲代碼正在工作,它只是要求進行一般性的代碼審查。 – Servy

回答

1
using System; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     string [] lines = new string[2]; 
     lines[0] = "John, 12345, true"; 
     lines[1] = "Miles, 45678, true"; 

     var o = from x in lines 
       let eachLine = x.Split(',') 
       select new { 
        name = eachLine[0], 
        zip = Int32.Parse(eachLine[1]), 
        status = bool.Parse(eachLine[2]) 
       }; 
     foreach (var p in o) { 
      Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status); 
     } 
    } 
} 

我總覺得let總是比較乾淨。我認爲除了split之外沒有更好的方法,對我來說看起來還不錯。

using System; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     string [] lines = new string[2]; 
     lines[0] = "John, 12345, true"; 
     lines[1] = "Miles, 45678, true"; 

     var o = from line in 
        (
         from inner in lines 
         select inner.Split(',') 
        ) 
       select new { 
        name = line[0], 
        zip = Int32.Parse(line[1]), 
        status = bool.Parse(line[2]) 
       }; 
     foreach (var p in o) { 
      Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status); 
     } 
    } 
} 

做的另一種方法是用內選擇@Habib已經表明下面這樣的「流暢」的方式,這是查詢的版本,我認爲這使得它更容易看到笏是怎麼回事。

享受您的旅程進入LINQ!

如果你能得到Jon Skeet的'C# In Depth'的副本,關於LINQ的部分是絕對的輝煌。正如本書的其餘部分。

+0

而不是使用'let'你可以有嵌套的選擇,這會更清晰 – user2711965

+0

Downvoter,你會詳細說說可能嗎? – Tarec

+0

@Tarec,我在上面的評論 – user2711965

2
var query = lines.Select(r => r.Split(',')) 
        .Select(t => new 
         { 
          name = t[0], 
          zip = int.Parse(t[1]), 
          status = bool.Parse(t[2]) 
         }); 
foreach (var p in query) 
{ 
    Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status); 
} 

,你會得到:

John - 12345, - True 
Miles - 45678, - True 
+2

我會投票給let子這是一個更乾淨的方式來做到這一點 –