从方法返回列表 <int> 并在 C# 中打印值的问题

Issues in returning a List<int> from a method and printing values in C#

我有这样的方法static List<int> Compare(List<int> a, List<int> b) 我希望此功能 return [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;
}

并将它们打印在:

static void Main(string[] args){}

目前您正在创建列表,然后您给出aPointsbPoints有用的值。当您将 aPointsbPoints 添加到列表时,您将添加 - 因此您最终得到 [0, 0] 的列表。

相反,您应该在最后创建列表 - 您实际上并不需要它的变量:

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 };
}

注意几点:

  • 无论 ab 有多长,您的代码总是循环 3 次。虽然现在可能没问题,但它有点不灵活......您不想检查它们的长度是否相同,然后完全迭代它们的任何原因?
  • 您可能想要考虑 return使用元组:
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);
}

毕竟,您 return 总是 的列表有两个元素,我怀疑调用者不想将其视为通用无论如何列出。


正在打印结果

如果您仍在使用列表方法 returning 值,您的 Main 方法应该如下所示:

static void Main()
{
    List<int> a = ... ; // However you want to populate this
    List<int> b = ... ; // However you want to populate this
    List<int> results = Compare(a, b);
    Console.WriteLine($"Score for a: {results[0]}");
    Console.WriteLine($"Score for b: {results[1]}");
}

如果你使用元组的方式,你会更清楚:

static void Main()
{
    List<int> a = ... ; // However you want to populate this
    List<int> b = ... ; // However you want to populate this
    var results = Compare(a, b);
    Console.WriteLine($"Score for a: {results.aPoints}");
    Console.WriteLine($"Score for b: {results.bPoints}");
}

这是一个非常简单的解决方案。只需创建一个空列表,然后在返回给调用者之前向其中添加 aPointsbPoints

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;
  • 或者您可以直接在 return 创建您的列表,如下所示:
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};
  • 此外,您可以使用语义上更正确的方式,因为您的列表始终有 2 个值。使用 tuple:
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);
}

根据您的评论,如果您想打印 Compare 方法 returns 的内容,那么对于 List<int> 您可以执行以下操作:

List<int> ret = Compare(someList, anotherList);
foreach (int n in ret)
{
    Console.WriteLine(n);
}
  • 或者您可以像这样使用经典的 for 循环:
List<int> ret = Compare(someList, anotherList);
for (int i = 0; i < 2; i++)
{
    Console.WriteLine(ret[i]);
}

但是,在这个循环中,假设您的列表总是有 2 个元素。一般的方法是将循环定义更改为 for (int i = 0; i < ret.Count; i++),以便它像 foreach 循环一样遍历列表中的每个可用项目。

整数通过 value 而不是 reference 传递。这意味着当您创建 new List<int>() { aPoints, bPoints }; 时,aPointsbPoints 的值都为 0,它们被复制到列表中。之后更改它们的值不会影响存储在列表中的副本。

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

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 };
}