2012-05-22 56 views
1

我有一個類的屬性:C#索引器和LINQ

public int this[int index] 
     { 
      get { return _desk[index]; } 
      set { _desk[index] = value; } 
     } 

,但我不能Linq中使用這個類。如何做到這一點?

+1

請舉例說明你正在嘗試做什麼。你的問題不清楚。 –

+0

你想如何使用它?你是什​​麼意思「我不能使用這個」?如果索引器是訪問數據的唯一方法,那麼你可以考慮實現IEnumerable

+2

你是什麼意思「我不能使用這個類」?我們既沒有看到一個班級,也沒有看到你如何使用它。 – Jon

回答

9

如果你的類沒有實現IEnumerable<T>,但有一個索引和計數屬性,你可以創建一個IEnumerable使用Enumerable.Range Method指標,並使用Enumerable.Select Extension Method各指標項目的集合項目:

var query = Enumerable.Range(0, obj.Count) 
         .Select(index => obj[index]) 
         ... 
+3

+1,這是實現'IEnumerable <..>'(特別是如果這個類不在你的控制之下)的可行替代方案,我不理解downvote。 – Rawling

+1

+1非常好的解決方案!我想人們總是需要「準備使用」的代碼,即使你需要一個玻璃球來猜測他們的意圖...... –

3

索引器不會自動爲您提供枚舉。爲了能夠調用LINQ方法,你需要在你的類上實現IEnumerable<int>

我假設你的_desk對象是一個簡單的數組 - 如果我在這裏錯了,_desk是其他類有索引器的東西,你可能需要使該類實現IEnumerable<int>

你會那麼需要做這樣的事情:

public class Position : IEnumerable<int> 
{ 
    private int[] _desk; 

    public int this[int index] 
    { 
     get { return _desk[index]; } 
     set { _desk[index] = value; } 
    } 

    /* the rest of your class */ 

    public IEnumerator<int> GetEnumerator() 
    { 
     return ((IEnumerable<int>)_desk).GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return _desk.GetEnumerator(); 
    } 
} 

我不知道如果GetEnumerator()的實現包裝的數組時是最好的做法,但他們應該工作。