2010-01-27 82 views
0

我有一個對象,它具有包含IEnumerable對象的屬性。 IEnumerable中的每個對象都有一個屬性,該屬性也是IEnumerable。我試圖捕捉內部財產的更大名單。不幸的是,我正在使用的lambda表達式返回一個OrderedEnumerable。我想只檢索一個簡單的IEnumerable。使用CustomerFormList從OrderedEnumerable獲取原始列表

OrgForm of = new OrgForm(); 
IEnumerable<Machine> machines = of.CustomerFormList 
            .Select(cf => cf.ActiveMachines); 

public class OrgForm 
{ 
    public string OrgNum { get; set; } 

    public IEnumerable<CustomerForm> CustomerFormList 
    { 
     get 
     { 
      var list = from cf in OrgCustomerList 
         where cf.Customer.AssignedOrg == OrgNum 
         select cf; 

      return list; 
     } 
    } 
} 

編輯

所以從喬恩斯基特和馬克·拜爾斯提示後,我看了一個更深一點,發現ActiveMachines已被修改爲執行OrderBy所以現在返回的OrderedEnumerable是有道理的(我不好意思閱讀代碼集更改註釋)。

public class CustomerForm 
{ 
    public IEnumerable<Machine> ActiveMachines 
    { 
     get 
     { 
      var active = Customer.MachineList.ToList() 
       .Where(m => "a".Equals(m.MachineStatus) 
          && !m.ToReapp); 

      return active.OrderBy(m => m.MachineCategory); 
     } 
    } 
} 

這是除了machines偉大不允許我爲它看到每個項目在machines作爲基於類的枚舉寫這樣的事情。

foreach (KeyValuePair<int, string[]> kvp in trueUpPt) 
{ 
    Machine machine = cf.ActiveMachines 
     .First(m => m.MachineSk == kvp.Key); 
    machine.MachineLicenseBillback.ProjectNum = kvp.Value[0]; 
    machine.MachineLicenseBillback.TaskNum = kvp.Value[1]; 
} 
+0

你究竟是什麼意思的「不起作用」。在運行時出現編譯時錯誤或異常?你會得到什麼錯誤信息? – 2010-01-27 20:50:46

+0

我還是不明白你的問題,對不起。也許你可以嘗試簡化你的問題,這樣整個代碼包括所有必要的類和函數都可以放在一個屏幕上,並且可以將代碼複製並粘貼到Visual Studio中,並查看你看到的完全相同的錯誤。沒有太多的代碼可以猜測你的問題。 – 2010-01-27 22:16:04

+0

我不理解編輯。 ActiveMachines顯式返回IEnumerable ,而不是IEnumerable >。你是什​​麼意思「不允許我」?就像Mark最初所說的那樣,明確你所看到的錯誤或錯誤。 – 2010-01-27 22:32:24

回答

2

OrderedEnumerable<T>IEnumerable<T> - 這是一個特定的實現。顯然你必須返回一些實現(或null) - 它不會直接作爲接口的實例。

您提交的代碼應該沒問題。這是宣佈返回IEnumerable<T>所以它應該沒有任何區別,除非你施放結果。話雖如此,你已經顯示的財產不應該返回OrderedEnumerable無論如何... Enumerable.Where只是返回一個新的迭代器。誠然,它不會改變訂單,所以你可能Where(this IOrderedEnumerable<T>)超載,但我不認爲有標準庫中的一個。

這是什麼問題實際上導致你,你是否使用一些額外的庫?如果你能想出一個簡短但完整的例子,那真的會有所幫助。

+0

我將這個問題的最終目的添加了出來。感謝您澄清'OrderedEnumerable '。仍然學習lambda/linq,並且必須厭倦跳到結論。 – ahsteele 2010-01-27 21:19:31

2

如果我沒有理解「捕捉內財產的大名單」正確,你只是想

of.CustomerFormList 
    .Where(cf => cf.Customer.AssignedOrg == OrgNum) 
    .SelectMany(cf => cf.ActiveMachines) 

這將返回一個IEnumerable<Machine>。正如其他答案所述,IOrderedEnumerable<T>只是一個子接口IEnumerable<T>

+0

+1根據字段的名稱,這看起來像是他想要什麼的智能猜測。無論如何,我在他的代碼中看不到任何「順序」,所以我仍然對他的問題部分感到困惑...... – 2010-01-27 20:57:38