我有这段代码:
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 :(得分: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;}
}