[Technical Issue] C# Basics - Използване на листи в методи
Здравейте, имам следния проблем при Five Special Letters. Създадох метод, който да калкулира теглото на всяка комбинация:
static int WeightCalculation (List<int> weights)
{
for(int i = 0; i<weights.Count; i++)
{
for(int j = i+1; j<weights.Count;j++)
{
if(weights[j] == weights[i])
{
weights.RemoveAt(j);
j--;
}
}
}
int weight = 0;
for(int i = 0; i< weights.Count; i++)
{
weight += (i + 1) * weights[i];
}
return weight;
}
Извиквам метода по следния начин:
weight = WeightCalculation(weightsTemp);
Установих обаче, че позициите от листа weights, които методът трие при изчисление на теглото, биват изтривани и от листа, който ползвам за задаване на входящите за метода параментри - weightsTemp.
не трябва ли методът каквото ползва, да е само до момента, в който върне стойност? И как мога да избегна триенето от weightsTemp?
Тук е целият код (все още незавършен):
http://pastebin.com/FnVVphd2
Не винаги е така. За да се промени дадена променлива от метод трябва или да е подадена по референция, или типът да е reference type. Листове и масиви са от втория тип, и променянето на ключ в масив или лист се променя в оригиналната декларация.
Ето пример:
static void Main(string[] args)
{
int val = 100;
int val2;
TryToChangeVal(val);
Console.WriteLine(val); // 100, а не 0
val2 = TryToChangeValAndReturn(val);
Console.WriteLine(val); // 100, а не 0
int[] val3 = new int[] { 1, 2, 3 };
TryToChangeReferenceTypeParam(val3);
foreach (var i in val3)
{
Console.WriteLine(i); // 1, 8, 3 понеже 1вият ключ е променен (масивът е reference type)
}
ChangeByRef(ref val);
Console.WriteLine(val); // 200, след като е подаден по референция
}
static void TryToChangeVal(int val)
{
val = 0;
}
static int TryToChangeValAndReturn(int val)
{
val = 0;
return val;
}
static void TryToChangeReferenceTypeParam(int[] val)
{
val[1] = 8;
}
static void ChangeByRef(ref int val)
{
val = 200;
}