2011-03-15 92 views
1

以下LINQ讀取分隔文件delimted文件。目前,它僅輸出recordId。我希望它輸出文件中的所有字段,以便我可以對數據執行一些額外的LINQ操作。例如,我想按recordId進行分組,按日期排序,並取(x)個結果。閱讀使用LINQ

  1. 我想要返回csv中的所有字段。我是否需要decalre變量並設置使用索引值,就像我爲FirstName,LastName和recordId所做的那樣?沒有什麼大不了,但是有更好的方法嗎?

  2. 我試圖消除return語句,並用新的投影,但沒有奏效。

有什麼建議嗎?

謝謝!

var recipients = File.ReadAllLines(path) 
.Select (record => 
{ 
string[] tokens = record.Split('|'); 

string FirstName = tokens[2]; 
string LastName = tokens[4]; 
string recordId = tokens[13]; 

return recordId; 
} 
) 
.GroupBy (recordId => {return recordId; }) 
.Dump(); 

回答

5

更改Select()項目,以保存所有你想要的屬性匿名類型:

.Select (record => 
{ 
    string[] tokens = record.Split('|'); 

    string FirstName = tokens[2]; 
    string LastName = tokens[4]; 
    string recordId = tokens[13]; 

    return new { RecordId = recordId, FirstName, LastName }; 
} 

你也可以改寫這個更succint:

File.ReadAllLines(path) 
    .Select(record => record.Split('|')) 
    .Select(tokens => new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] }) 
    .GroupBy(x => x.RecordId) 
    .Dump(); 
0

VAR的查詢=從l在線路選擇創建對自定義類型,然後後來你侃組左右別的{從查詢.....}

0

注 - 我不是真正確定你想要在你的「分組」達到什麼 - 你真的希望集團通過ID?或者這是一個OrderBy呢?

我覺得你可以達到你想要使用匿名類型,例如:

var recipients = File.ReadAllLines(path) 
    .Select(record => record.Split('|')) 
    .Select(split => new { 
     TheDate = Date.Parse(tokens[0]), // this might be the wrong index? 
     FirstName = tokens[2], 
     LastName = tokens[4], 
     RecordId = tokens[13], 
    }) 
    .OrderBy(anon => anon.TheDate) 
    .Dump(); 

如果你想用一個實際的類型,那麼這篇文章從喬恩斯基特可能有助於爲背景 - http://www.developerfusion.com/article/84468/linq-to-log-files/

+0

有一個排序依據根據日期。我只是在我的本地代碼版本中添加了這一點。我想recordId所分組的記錄和按日期排序降序(最近在頂部) – DenaliHardtail 2011-03-15 19:49:23

+0

如果組recordId所,那麼以後你只能訪問的recordId和分組的總的方法(例如,最小值,最大值,平均值) - 所以我不太瞭解如何在日後得到日期 - 這將從何而來?你真的希望結果按recordId排序,然後按日期排序嗎? – Stuart 2011-03-15 20:00:36

0

BrokenGlass已經回答了這個問題,但我只是想指出的是,這個語法看起來更清潔(至少對我來說):

var recipients = File.ReadAllLines(path) 
.Select(record => record.Split('|')) 
.Select (tokens => 
    new { 
     FirstName = tokens[2], 
     LastName = tokens[4], 
     recordId = tokens[5] 
    } 
) 
.GroupBy(person => person.recordId) 
.Dump(); 

這裏並不需要帶語句塊的lambda表達式。

0

我來補充:

var recipients = (from record in File.ReadAllLines(path) 
    let tokens = record.Split('|') 
    let record2 = new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] } 
    group record2 by record2.RecordId 
).Dump(); 

在LINQ非功能性的語法。

我會添加另一種變體,使用select ... into而不是let

var recipients = (from record in File.ReadAllLines(path) 
    select record.Split('|') into tokens 
    select new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] } into record2 
    group record2 by record2.RecordId 
).Dump(); 

您將需要標杆他們找到最快的(和它肯定會很有趣......明天早上我會嘗試)