返回列表时出现的问题<;int>;从一个方法和打印值在C#

返回列表时出现的问题<;int>;从一个方法和打印值在C#,c#,console-application,.net-core-3.0,C#,Console Application,.net Core 3.0,我有这样一种方法静态列表比较(列表a,列表b) 我希望此函数返回[aPoints bPoints]类似[2 1] 但是,我一直坚持使用if语句在循环后存储值,并将它们放入分数中。 我试过这个: static List<int> Compare(List<int> a, List<int> b) { int aPoints = 0; int bPoints = 0; List<int> score = new

我有这样一种方法
静态列表比较(列表a,列表b)
我希望此函数
返回[aPoints bPoints]
类似
[2 1]
但是,我一直坚持使用
if
语句在循环后存储值,并将它们放入分数中。 我试过这个:

static List<int> Compare(List<int> a, List<int> b)
{        
    int aPoints = 0;
    int bPoints = 0;
    List<int> score = new List<int>() { aPoints, bPoints }; 

    for (int i = 0; i < 3; i++)
    {
        if (a[i] > b[i])
        {
            aPoints++;
        }
        else if (a[i] < b[i])
        {
            bPoints++;
        }
    }

    return score;
}

当前,在给出
aPoints
bPoints
有用值之前,您正在创建列表。当您将
aPoints
bPoints
添加到列表中时,您正在添加值-因此您将得到一个
[0,0]
列表

相反,您应该在末尾创建列表-实际上不需要变量:

静态列表比较(列表a、列表b)
{        
int aPoints=0;
int bPoints=0;
对于(int i=0;i<3;i++)
{
如果(a[i]>b[i])
{
aPoints++;
}
如果(a[i]
需要注意的几点:

  • 无论
    a
    b
    有多长,代码总是循环3次。虽然现在可能没问题,但有点僵化。。。有什么原因不想检查它们的长度是否相同,然后完全迭代它们吗
  • 你可能想考虑返回一个元组代替:
static(int aPoints,int bPoints)比较(列表a,列表b)
{        
int aPoints=0;
int bPoints=0;
对于(int i=0;i<3;i++)
{
如果(a[i]>b[i])
{
aPoints++;
}
如果(a[i]
毕竟,您将返回的列表总是有两个元素,我怀疑调用方无论如何都不想将其视为通用列表


打印结果

如果仍然使用列表方法返回值,则主要方法应如下所示:

static void Main()
{
列表a=…;//您希望如何填充此
列表b=…;//您希望如何填充此
列表结果=比较(a,b);
WriteLine($”a:{results[0]}的分数);
WriteLine($”b:{results[1]}的分数);
}
如果使用元组方法,您可以更清楚地看到:

static void Main()
{
列表a=…;//您希望如何填充此
列表b=…;//您希望如何填充此
var结果=比较(a,b);
WriteLine($”a:{results.aPoints}的分数);
WriteLine($“b:{results.bPoints}的分数”);
}

这里有一个非常简单的解决方案。只需创建一个空列表,并在返回调用者之前向其添加
aPoints
bPoints

static List<int> Compare(List<int> a, List<int> b)
{        
    int aPoints = 0;
    int bPoints = 0;
    List<int> score = new List<int>();

    for (int i = 0; i < 3; i++)
    {
        if (a[i] > b[i])
        {
            aPoints++;
        }
        else if (a[i] < b[i])
        {
            bPoints++;
        }
    }
    score.Add(aPoints);
    score.Add(bPoints);
    return score;
  • 此外,您可以使用语义更正确的方法,因为您的列表总是有2个值。使用:
  • 或者,您也可以使用经典的
    循环,如下所示:
List ret=Compare(某个列表,另一个列表);
对于(int i=0;i<2;i++)
{
控制台写入线(ret[i]);
}
然而,在这个循环中,假设列表中总是有两个元素。一般的方法是将循环定义更改为
for(inti=0;i
,以便它像
foreach
循环一样迭代列表中的每个可用项。

整数是通过值传递的,而不是通过引用传递的。这意味着当您创建一个
newlist(){aPoints,bPoints}
,则将
aPoints
bPoints
的值(均为0)复制到列表中。之后更改其值不会影响存储在列表中的副本


对于这种特定情况,最简单的方法是简单地移动您的行
List score=new List(){aPoints,bPoints}在循环之后。然后,在正确设置点值后,将复制这些点值。

点和点是值类型,而不是引用类型,因此将它们放在最后:

static List<int> Compare(List<int> a, List<int> b)
{        
    int aPoints = 0;
    int bPoints = 0;

    for (int i = 0; i < 3; i++)
    {
        if (a[i] > b[i])
        {
            aPoints++;
        }
        else if (a[i] < b[i])
        {
            bPoints++;
        }
    }

    return new List<int>() { aPoints, bPoints };
}
静态列表比较(列表a、列表b)
{        
int aPoints=0;
int bPoints=0;
对于(int i=0;i<3;i++)
{
如果(a[i]>b[i])
{
aPoints++;
}
如果(a[i]
int不是通过引用传递的。它们是按值传递的。当您创建
score
时,您正在将其输入
0
0
。当
aPoints
bPoints
更改时,这些值不会更新。它得到了他们在分配任务时的状态。没有别的了link@DetectivePikachu谢谢列表将按值传递。谢谢!在第二个示例中,如何在静态void Main上打印这些值?类似于:Console.WriteLine(Program.Compare(a,b));这将显示为System.Collections.Generic.List`1[System.Int32]是,因为您实际上是在打印类型而不是内容。编辑问题以包含您的评论,我将编辑答案以包含打印。谢谢!关于你的第一个例子。它循环了3次,因为:List a=newlist(){15,32,44};列表b=新列表(){88,12,8}@杰克曼:但是如果你把两个较小的列表传给别人,你希望会发生什么呢?还是两张更大的名单?你不认为它总是期望有3个元素,这可能会让用户感到惊讶吗?这是有道理的。如何动态地遍历这两个数组的长度?或者您可以单独计算每个值吗?@Jacman:
List.Count
是一个返回列表大小的属性。如果两个列表(它们不是数组)的长度不相同,我可能会首先抛出一个异常,然后在循环中使用
a.Count
而不是3。是的,列表。。。我认为这个概念是一种收集
static List<int> Compare(List<int> a, List<int> b)
{        
    int aPoints = 0;
    int bPoints = 0;

    for (int i = 0; i < 3; i++)
    {
        if (a[i] > b[i])
        {
            aPoints++;
        }
        else if (a[i] < b[i])
        {
            bPoints++;
        }
    }

    return new List<int>() { aPoints, bPoints};
static (int aPoints, int bPoints) Compare(List<int> a, List<int> b)
{        
    int aPoints = 0;
    int bPoints = 0;

    for (int i = 0; i < 3; i++)
    {
        if (a[i] > b[i])
        {
            aPoints++;
        }
        else if (a[i] < b[i])
        {
            bPoints++;
        }
    }

    return (aPoints, bPoints);
}
List<int> ret = Compare(someList, anotherList);
foreach (int n in ret)
{
    Console.WriteLine(n);
}
List<int> ret = Compare(someList, anotherList);
for (int i = 0; i < 2; i++)
{
    Console.WriteLine(ret[i]);
}
static List<int> Compare(List<int> a, List<int> b)
{        
    int aPoints = 0;
    int bPoints = 0;

    for (int i = 0; i < 3; i++)
    {
        if (a[i] > b[i])
        {
            aPoints++;
        }
        else if (a[i] < b[i])
        {
            bPoints++;
        }
    }

    return new List<int>() { aPoints, bPoints };
}