2011-01-10 49 views
0

我有一個數據表,我想從結果中選擇所有不同的名稱。我爲它寫了下面的linq查詢。c#linq問題

var distinctRows = (from DataRow myDataRow in myDataTable.Rows 
        select new { col1 = myDataRow ["Name"]}).Distinct(); 

現在我該如何迭代distinctRows?似乎我不能做foreach(DataRow Row in distinctRows),它給我「不能轉換類型'匿名類型#1'到'System.Data.DataRow'」錯誤

+4

你讀過錯誤嗎? – SLaks 2011-01-10 20:17:18

+4

未來,如果問題的標題描述了您的問題,您可能會得到更好的結果。 「C#linq問題」沒有告訴我們什麼; C#和linq已經是標籤了,我們知道它是一個問題。 – 2011-01-10 20:21:43

+0

@Eric,謝謝你指出。對不起,使用愚蠢的標題:) – imak 2011-01-10 21:50:19

回答

3

由於您只選擇了一個字段,因此您不需要匿名類型。只需選擇名稱,然後遍歷不同的名稱即可。即:

var distinctNames = (from DataRow myDataRow in myDataTable.Rows 
        select myDataRow.Field<string>("Name") 
        ).Distinct(); 

foreach(var name in distinctNames) { 
    Console.WriteLine(name); 
} 

請注意,錯誤很清楚地表明問題出在哪裏。您正嘗試將匿名類型的實例轉換爲DataRow的實例,這是不可能的。不改變你的代碼,你可以遍歷這個作爲

foreach(var item in distinctRows) { 
    Console.WriteLine((string)item.col1); 
} 

但我想改變這種按照上面的,你不需要匿名類型和變量名和字段名都很差。

2

那些不是DataRows;他們是匿名對象。
要遍歷它們,您需要使用var關鍵字聲明變量。

然而,首先匿名類型沒有意義。
您可以將您的查詢更改爲select myDataRow.Field<string>("Name")以獲取一組字符串。

0

這是因爲myDataRow["Name"]沒有返回DataRow。嘗試

foreach(var item in distinctRows) {} 
1

您可以使用關鍵字var來引用匿名類型(這是您返回的IEnumerable<>)。

foreach(var row in distinctRows) 
{ 
    // do something with each anonymous type instance 
} 

既然你只返回匿名類型的一個字符串屬性不過,你不妨投影IEnumerable<string>

0

這是因爲返回值不是一個DataRow。這是一個包含屬性col1的ad-hoc類型。

0

建立在SLaks的答案。 。 。

var distinctRows = (from DataRow myDataRow in myDataTable.Rows 
        select new { col1 = myDataRow ["Name"]}).Distinct(); 

foreach(var row in distinctRows) 
{ 
    System.Console.Writeline(row.col1); //should work fine 
} 
0

這裏的問題是,您選擇一個新的匿名類型,通過做select new { col1 = myDataRow ["Name"]}而不是實際的行本身。因此,當您嘗試將此迭代爲DataRow時,它將會出錯,因爲您選擇的匿名類型不是DataRow類型。

如果您希望能夠選擇整個數據行而不僅僅是名稱字段,則需要爲數據行實現自定義IEqualityComparer以傳遞給Distinct()擴展方法。

一個例子是:

public class NameComparer : IEqualityComparer<DataRow> 
{ 
    public bool Equals(DataRow left, DataRow right) 
    { 
     return left.Field<string>("Name").Equals(right.Field<string>("Name")); 
    } 

    public int GetHashCode(DataRow obj) 
    { 
     return obj.ToString().GetHashCode(); 
    } 
} 

然後使用它:

var distinctRows = (from DataRow myDataRow in myDataTable.Rows 
        select myDataRow).Distinct(new NameComparer()); 
0

你也可以的foreach他們,但首先你必須列出來,如下所示:

List<string> rslt =(from DataRow myDataRow in myDataTable.Rows 
        select new { col1 = myDataRow ["Name"].ToString()}).Distinct().ToList(); 

foreach(string str in rlst) 
{} 

希望這有幫助