distinct()使我的参数表现得像一个值类型
本文关键字:一个 类型 我的 参数 distinct | 更新日期: 2023-09-27 18:06:11
我有一个简单的整数列表,叫做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);
}
}
当您调用FillNumbers
时,您不会改变Numbers
变量。你首先改变给定的列表,然后根据不同的值生成一个新列表,然后将其分配给numbers
,这是一个与Numbers
非常不同的变量。它是该方法的一个参数,一旦FillNumbers
完成执行,它就会消失。虽然您可以将您正在创建的列表分配给Numbers
而不是numbers
,但最佳实践实际上是将列表分配给return
,让调用者对它做他们想做的事情,并且根本不接受列表作为输入,因为您的目标是创建一个全新的列表。
CountNumbers
观察列表中的非不同值,那是因为在添加项时,您正在改变 numbers
引用的列表,而不是改变引用本身。 这一行:
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);
}
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;
}
}