2012-09-19 119 views
1

有沒有一種方法可以在同一枚枚舉上運行的方法中引用源枚舉?引用可枚舉的方法中的枚舉源?

例如,該代碼重複1-6原始枚舉範圍:

IEnumerable<int> result = Enumerable.Range(1, 6) 
    .Where(a => Enumerable.Range(1, 6).Count() % 2 == 0); 

我想知道是否存在與重複原始枚舉以產生它的清潔器的方式,如:

IEnumerable<int> result = Enumerable.Range(1, 6) 
    .Where(a => [source reference].Count() % 2 == 0); 

是的,我知道以下是解決方案...但有沒有辦法直接引用內存中的枚舉,如上所示?

IEnumerable<int> source = Enumerable.Range(1, 6); 
IEnumerable<int> result = source.Where(a => source.Count() % 2 == 0); 

我不是在尋找上述代碼行的特定答案;他們只是一個展示我想知道的例子。

+5

我不認爲C#有一個解決方案,而不是你的最後一個例子。我認爲這最後一個例子是很容易理解的。 – zmbq

+0

當您沒有直接引用它時,您如何期望直接引用枚舉? – asawyer

+3

爲什麼在'Where'查詢中使用條件會給每個項目提供相同的結果? – Rawling

回答

2

內置的IEnumerable擴展方法都不能做你想做的。它們都接受只對單個項目進行操作的lamba表達式,所以表達式無法訪問父容器。

沒有什麼是滾動自己阻止你,不過,這樣的:

public static IEnumerable<T> WhereSource<T> (this IEnumerable<T> source, Func<IEnumerable<T>, T, bool> predicate) 
{ 
    foreach (var item in source) 
    { 
    if (predicate(source, item)) 
    { 
     yield return item;  
    } 
    } 
} 

就個人而言,我認爲你原來的解決方案比手工製作自己的自定義擴展方法更清晰,更易於維護,更好的,但這當然是可能的。

+0

然後調用網站看起來像'IEnumerable 結果= Enumerable.Range(1,6).WhereSource((source,item)=> source。Count()%2 == 0);'這是一個非常沒用的例子,因爲它總是'true' – asawyer

+0

所有真正的語句,這就是爲什麼OP說「我不是在尋找特定的代碼行以上;他們只是一個示例,展示我想知道的內容。「 –

0

不,你不能因爲Enumerable.Range(1, 6))沒有名字。

你將如何調用一個沒有名字的實體。

您的第三個片段是您可以使用的唯一解決方案,因爲它沒有名稱來引用。

但是你可以做

int length = 6; // Here hard-coded but can be passed from a parameter. 
IEnumerable<int> source = Enumerable.Range(1, Length); 
IEnumerable<int> result = source.Where(a => length % 2 == 0); 
1

你說這個?

IEnumerable<int> source = Enumerable.Range(1, 6); //{1,2,3,4,5,6} 
IEnumerable<int> result = source.Where((a, i) => i % 2 == 0); //{1,3,5} 
IEnumerable<int> result2 = source.Where(a => a % 2 == 0); //{2,4,6} 
+0

他正在採取收集的長度,而不是指數的mod。 –

+3

@NikhilAgrawal我明白了......但是有沒有什麼意義......他只能做到'6%2' ......爲什麼要枚舉? – horgh

+1

可能是該值作爲參數傳遞。 –