我有一个名为Numbers的整数简单列表。我将此列表发送给2个方法:第一个使用随机填充列表,其中333个数字介于1和100之间。在填充结束时,我使用' Distinct()'在我的列表上只获取不同的随机数,而不是打印出列表中的项目数量。我的第二种方法是接收列表并打印出其中的元素数量,' Count'属性。
我是如何一直在同一个名单上工作并得到不同的结果?
这是我的代码:
class Program
{
static List<int> Numbers = new List<int>();
static Random Rnd = new Random();
static void Main(string[] args)
{
FillNumbers(Numbers);
CountNumbers(Numbers);
Console.ReadLine();
}
private static void CountNumbers(List<int> numbers)
{
Console.WriteLine("There are {0} numbers the list", numbers.Count);
}
private static void FillNumbers(List<int> numbers)
{
for (int i = 0; i < 333; i++)
{
int n = Rnd.Next(1, 101);
numbers.Add(n);
}
numbers = numbers.Distinct().ToList();
Console.WriteLine("After distinct there are {0} numbers in the list",numbers.Count);
}
}
答案 0 :(得分:4)
当您致电FillNumbers
时,您不会改变Numbers
变量。您首先改变您给出的列表,然后根据不同的值生成新列表,然后将其分配给numbers
,这是一个与Numbers
非常不同的变量。它是该方法的参数,只要FillNumbers
完成执行就会消失。虽然您可以将您要创建的列表分配给Numbers
而不是numbers
,但最佳做法实际上是return
列表并让调用者执行此操作他们想要什么,也不接受列表作为输入,因为你的目标是创建一个全新的列表。
至于为什么CountNumbers
正在观察列表中的非不同值,这是因为在添加项目时,您正在改变 numbers
引用的列表,而不是改变引用本身。
答案 1 :(得分:0)
这一行:
numbers = numbers.Distinct().ToList();
正在创建一个新列表。 此列表将仅包含不同的值,但您的原始列表不会。 通过引用调用将解决它:
private static void FillNumbers(ref List<int> numbers)
{
for (int i = 0; i < 333; i++)
{
int n = Rnd.Next(1, 101);
numbers.Add(n);
}
numbers = numbers.Distinct().ToList();
Console.WriteLine("After distinct there are {0} numbers in the list",numbers.Count);
}
答案 2 :(得分:-3)
class Program
{
static void Main(string[] args)
{
var numbers = GetNumbers();
CountNumbers(numbers);
Console.ReadLine();
}
private static void CountNumbers(List<int> numbers)
{
Console.WriteLine("There are {0} numbers the list", numbers.Count);
}
private static List<int> GetNumbers()
{
var random = new Random();
var numbers = new List<int>();
for (int i = 0; i < 333; i++)
{
numbers.Add(random.Next(1, 101));
}
numbers = numbers.Distinct().ToList();
Console.WriteLine("After distinct there are {0} numbers in the list",numbers.Count);
return numbers;
}
}