从方法返回列表 <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){}
目前您正在创建列表,然后您给出aPoints
和bPoints
有用的值。当您将 aPoints
和 bPoints
添加到列表时,您将添加 值 - 因此您最终得到 [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 };
}
注意几点:
- 无论
a
和 b
有多长,您的代码总是循环 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}");
}
这是一个非常简单的解决方案。只需创建一个空列表,然后在返回给调用者之前向其中添加 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;
- 或者您可以直接在
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 };
时,aPoints
和 bPoints
的值都为 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 };
}
我有这样的方法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){}
目前您正在创建列表,然后您给出aPoints
和bPoints
有用的值。当您将 aPoints
和 bPoints
添加到列表时,您将添加 值 - 因此您最终得到 [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 };
}
注意几点:
- 无论
a
和b
有多长,您的代码总是循环 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}");
}
这是一个非常简单的解决方案。只需创建一个空列表,然后在返回给调用者之前向其中添加 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;
- 或者您可以直接在
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 };
时,aPoints
和 bPoints
的值都为 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 };
}