2016-02-11 36 views
0

我對使用VB.Net的LINQ相當陌生。我知道它在獲取結果方面速度非常快。使用linq從數據集表中獲得不同的計數和名稱

我有一個表的數據集,並希望與計數

的數據由(大約50,000行的CSV)

p1.pdf

e3.xls
表示檢索不同的值
d1.doc

p2.pdf

e2.xls

d2.doc

p1.pdf

e3.xls

d2.doc

d4.doc

想有這樣

p1.pdf - 2
p2.pdf - 1

e3.xls - 2
個e2.xls - 1

d2.doc - 2
d1.doc - 1
d4.doc - 1

我已經試過這樣的事情

Dim Filtered = From row in ds.tables("AuditLog").AsEnumerables() 
       Where (row.Field(Of String)("DocName") Like "*.pdf") 

Dim dt as New Datatable 
dt = Filtered.CopyToDataTable 

這使所有pdf文件的清單,我可以使用數據視圖來計算,但如果有更快的方法獲得計數,這將是很好的

如果可能的話請幫我

感謝您的耐心

+0

1)GROUPBY名,2)選擇與元素3)排序依據最後的財產的GROUPBY的名稱和int,計數新對象組名3個字符。在C#中它看起來像這樣:'table.GroupBy(t => t.DocName).Select(t => new {name = t.Key,count = t.Count()} .OrderBy(t => t。 name.Substring(t.name.Length-3));' –

+0

嗨亞歷山大,我確信這將是一個正確的答案,但我不知道C#,並會花費我更多的時間解碼相同。可以幫助我在vb.net轉換相同,我將非常感謝 – user1753985

+0

只要說你需要的算法,所有相同的方法都可以在vb.net但我不知道的語法:/ –

回答

2

試試這個

Dim dt As DataTable 
    Dim dr As DataRow 
    Dim nameCoulumn As DataColumn 

    dt = New DataTable("files") 
    nameCoulumn = New DataColumn("Name", Type.GetType("System.String")) 
    dt.Columns.Add(nameCoulumn) 

    dr = dt.NewRow() 
    dr("Name") = "p1.pdf" 
    dt.Rows.Add(dr) 

    dr = dt.NewRow() 
    dr("Name") = "e3.xls" 
    dt.Rows.Add(dr) 

    dr = dt.NewRow() 
    dr("Name") = "p2.pdf" 
    dt.Rows.Add(dr) 

    dr = dt.NewRow() 
    dr("Name") = "p1.pdf" 
    dt.Rows.Add(dr) 

    Dim query = From row In dt.AsEnumerable() 
       Group row By name = row.Field(Of String)("Name") Into g = Group 
    Select New With { 
     Key name, 
     .Count = g.Count() 
     } 

    For Each row In query 
     Console.WriteLine(String.Format("{0} - {1}", row.name, row.Count.ToString())) 
    Next  
+0

謝謝你丹尼爾。拯救生命 – user1753985

相關問題