2011-01-11 152 views
0

我是linq的全新品牌。由於缺乏經驗,我相信我錯過了一些東西。Linq物體枚舉

問題: 我使用LINQ查詢對象,並返回枚舉科目對象where o.Diff!=0

如果我試圖枚舉結果我得到的錯誤unable to cast object of type System.Collections.Generic.KeyValuePair '2[Acct]' to type 'Acct'

問題: 如何從Linq查詢返回可枚舉的Acct對象?

在此先感謝!

public class AcctSum 
{ 
    string ID; 
    Decimal Amt1; 
    Decimal Amt2; 
    Decimal Diff; 
    ArrayList<AcctDet> lines; 
} 

public class AcctInfo 
{ 
    Dictionary<string,AcctSum> acct 

    //code that adds the data... 
    public iEnumerable Discrepancies() 
    { 
    var results = (from Acct a in acct 
        where a.Diff != 0 
        select a).AsEnumerable<Acct>(); 
    foreach (var result in results)//at runtime this generates an error 

    { 
    }          
    return results.GetEnumerator(); 
    } 
} 
+0

您正在交換使用Acct和AcctSum。這看起來不正確。如果Acct是枚舉,則不能將其從一個轉換爲另一個。 – Schultz9999

+0

首先將'from'中的'Acct'改成一個不是類型名稱的變量名稱,比如'variable1',然後將'AsEnumerable ()'改爲'AsEnumerable ()',最後將'in acct'改爲'在acct.Values' –

回答

0

正如其他人所說,這聽起來像你想被遍歷值,而不是鍵/值對。

這意味着你可以使用這樣的查詢:

var results = from acctSum value in acct.Values 
       where acctSum.Diff != 0 
       select acctSum; 

但我個人不會在這種情況下使用查詢表達式麻煩。我只是使用擴展方法:現在

var results = acct.Values.Where(acctSum => acctSum.Diff != 0); 

,在返回類型而言,我強烈懷疑你想回到IEnumerable<AcctSum>而非IEnumeratorIEnumerator<T>。所以,你可能想:

public IEnumerable<AcctSum> Discrepancies() 
{ 
    return acct.Values.Where(acctSum => acctSum.Diff != 0); 
} 

,或者你可能要「兌現」查詢 - 獲得所有結果一氣呵成,並返回那些(而不是返回可以懶洋洋地遍歷一個查詢)。例如:

public IEnumerable<AcctSum> Discrepancies() 
{ 
    return acct.Values.Where(acctSum => acctSum.Diff != 0).ToList(); 
} 

特別是,通過物化你允許呼叫者修改acct當他們遍歷這些結果查詢 - 如果他們試圖這樣做,當他們遍歷原始查詢,他們會得到一個例外。

您還需要更改AcctSum類,因爲ArrayList不是.NET中的泛型類型。你的意思是使用List<T>

+0

我將切換ArrayList到List,我在另一個示例中看到它。我正在嘗試這個,謝謝! – kes

+0

最後一個例子,.ToList(),正是我想要的;儘管如此,整件事仍然感覺像是一個魔術。 我想現在是時候採取的眼罩和學習新的範例:) – kes

0

嗯,這是B/C ACCT是一本字典(這是一個IEnumerable <KeyValuePair>,IIRC,引擎蓋下。從ACCT更改源acct.Values

1

當你遍歷acct ,每個項目是字典中的鍵/值對假設Acct對象每對中的值,你會得到所有非零賬戶是這樣的:

from a in acct.Values 
where a.Diff != 0 
select a 
3

的問題是,當你它在你的字典上進行計算,你正在將每個項目轉換爲一個Acct,實際上,你的Dictionary中的每個項目都是一個KeyValuePair。嘗試類似:

from KeyValuePair<string,AcctSum> acctKVP in acct // assuming acct is of type Dictionary<string,AcctSum> 
where acctKvp.Value.Diff != 0 
0

首先,返回類型應該是IEnumerator,而不是IEnumerable。 其次,ACCT包含鍵值對的集合,所以你需要運行關鍵數值查詢(在這種情況下)

void Main() 
{ 
    var acctInfo = new AcctInfo(); 
    acctInfo.Discrepancies(); 

} 
public class AcctSum 
{ 

    string ID; 
    Decimal Amt1; 
    Decimal Amt2; 
    public Decimal Diff; 
    ArrayList lines; 
} 

public class AcctInfo 
{ 
    public IEnumerator Discrepancies() 
    { 
     var acct = new Dictionary<int, AcctSum> 
         {{1, new AcctSum() {Diff = 0.0M}}, {2, new AcctSum() {Diff = 1.0M}}}; 

     var results = (from AcctSum a in acct.Values where a.Diff != 0 select a).AsEnumerable(); 

     foreach (var result in results)//at runtime this generates an error 
     { 

     } 
     return results.GetEnumerator(); 
    } 
} 
+0

其實,我會返回'IEnumerable '而不是'IEnumerator'。從除了實現「IEnumerable」或「IEnumerable」的GetEnumerator方法以外的任何其他方法返回迭代器非常罕見。 –

+0

與我一樣,但是當他返回GetEnumerator()時,我認爲這是故意的。無論哪種方式,東西不得不改變:) – Rob

+0

是啊,我搞砸了。我試圖實現,以便我可以做foreach和/或將其返回給datagrid綁定。是的,對於綁定我需要調整變量的屬性:) – kes