2011-08-09 54 views
1

「編輯」一個外部對象有這樣的代碼:我如何在功能

CreaPager(m_oPacchettiEnum, 1, 10); 

private void CreaPager(IEnumerable enPass, int limiteUp, int limiteDown) 
{ 
    enPass= enPass.Skip(limiteDown).Take(limiteUp); 
} 

,我想,當我編輯enPass,反映編輯到m_oPacchettiEnum,不具有返回IEnumerable<T>功能。

所以,直接編輯m_oPacchettiEnum函數就可以了。我用它來做C,不知道是否可以在C#上(但我認爲是這樣)。

我讀出頭有關使用out,但似乎它不工作:

CreaPager(out m_oPacchettiEnum, 1, 10); 

private void CreaPager(out IEnumerable enPass, int limiteUp, int limiteDown) 
{ 
    enPass= enPass.Skip(limiteDown).Take(limiteUp); 
} 
+0

枚舉是一個C#的關鍵字,它重命名爲別的 – yoozer8

+0

已經嘗試過的東西!它不能解決問題... – markzzz

+2

您可以使用'ref',但請返回'IEnumerable'。它非常乾淨。 –

回答

4

out,因爲你不能用不在這裏工作了方法中的out參數,直到它被分配爲止。由於您的作業使用enum(您應該重新命名)作爲右側的一部分,因此不允許。切換outref將使事情工作。

但是。正如我在回答您之前(現已刪除)的問題中所提到的,請不要這樣做。通過與this第一個參數前面

var newQuery = CreaPager(m_oPacchettiEnum, 1, 10); 

private void CreaPager<T>(IEnumerable<T> enumeration, int limiteUp, int limiteDown) 
{ 
    return enumeration.Skip(limiteDown).Take(limiteUp); 
} 

同時,可以使該方法的extension method

private void CreaPager<T>(this IEnumerable<T> enumeration, int limiteUp, int limiteDown) { .. } 

做與序列工作返回一個新的IEnumerable<T>更地道因此您可以將您的方法集成到LINQ到對象的調用鏈中:

var query = myEnumerable.Where(x => x.OtherProp == 1).CreaPager(1, 10).Select(x => x.SomeProp); 

編輯:既然你還需要返回string,使out參數:

private void CreaPager<T>(this IEnumerable<T> enumeration, int limiteUp, int limiteDown, out string myString) 
{ 
    myString = "foo"; 
    return enumeration.Skip(limiteDown).Take(limiteUp); 
} 

你會打電話像這樣的方法:

string theString; 
var newQuery = CreaPager(m_oPacchettiEnum, 1, 10, out theString); 

out是這裏很好,因爲我假設你不需要同時使用和分配字符串。如果你這樣做,那麼我建議你將它分成兩個參數。

+1

+1推薦反對修改對象ref而不是返回新的集合 –

+0

正是我在想什麼,爲linq點+1 – Jodrell

+0

@Jodrell如果是這樣,請隨時調用:) – dlev

4

使用ref,而不是out

CreaPager(ref m_oPacchettiEnum, 1, 10); 

private void CreaPager(ref IEnumerable enum, int limiteUp, int limiteDown) 
{ 
    enum = enum.Skip(limiteDown).Take(limiteUp); 
} 
+0

這將工作,並正在要求什麼,但是,當你想要下一個「傳呼機」會發生什麼? – Jodrell

+0

@Jodrell:你是什麼意思? – markzzz

+0

最初'm_oPacchettiEnum'持有「完整」集合。 'CreaPager'在一定範圍內限制'm_oPacchettiEnum'。後來我想限制'm_oPaccettiEnum'在不同的範圍內,但我的原始「完整」集合已被替換。 – Jodrell

2

@Serge答案會工作,但不會是更好地做到這

IEnumerable pager = CreaPager(m_oPacchetti, 1, 10); 

private IEnumerable CreaPager(IEnumerable pachetti, int limiteUp, in limiteDown) 
{ 
    return pachetti.Skip(limiteDown).Take(limiteUp - limiteDown); 
} 

這樣,你可以重用m_oPachetti而且可以避免討厭的引用傳遞和代碼更容易閱讀。

編輯:

怎麼樣,因爲 「尋呼機」 是意大利的名詞??? 尋呼機是一個IEnumerable,你還可以擴展功能,而不是傳遞的字符串中。

string theString = "TheStringYouNeedToReturn"; 
Pager<?> pager = new Pager<?>(m_oPacchetti, 1, 10); 

private class Pager<T> : List<T> 
{ 
    private Pager(){} 

    public Pager(IEnumerable<T> pachetti, 
        int limiteUp, 
        int limiteDown, 
        string aString) 
    { 
     this.AString = astring; 
     this.AddRange(pachetti.Skip(limiteUp).Take(limiteUp - limiteDown); 
    } 

    public string AString {get; private set;} 

} 
+0

+1非常正確;-) –

+0

我無法做到這一點。是我想擺脫的!我需要返回一個字符串:) – markzzz