如何“编辑”函数中的外部对象

时间:2011-08-09 14:27:44

标签: c# function

我有这段代码:

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);
}

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:4)

out在此处不起作用,因为在分配之前,您无法在方法中使用out参数。由于您的作业使用enum(您应该重命名)作为右侧的一部分,因此不允许这样做。将out切换为ref会使事情有效。

<强>然而即可。正如我在回答您之前(现已删除)的问题时提到的那样,请不要这样做。使用序列返回新的IEnumerable<T>时,很多更加惯用:

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

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

同样,您可以通过在第一个参数前加this来使方法成为extension method

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

这样做可以让您将方法集成到LINQ-to-Objects调用链中:

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在这里很好,因为我假设您不需要同时使用和分配字符串。如果你这样做,那么我建议你把它分成两个参数。

答案 2 :(得分: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并避免讨厌的引用传递,代码更容易阅读。

编辑:

怎么样,因为“Pager”是意大利名词??? Pager是一个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;}

}