C# 从一个方法C返回多个值#

C# 从一个方法C返回多个值#,c#,methods,C#,Methods,抱歉,重复的问题,我看了类似的Qs,只是感到困惑。我有一个方法,提示用户输入5个不同的属性值,并希望返回所选的值,以便在程序中用于以后的决策 while (true) { Console.Write("Please enter a value between 0-10 for ingenuity: "); inputIngenuity = Console.ReadLine(); if (!UInt32.TryParse(inputIngenuity, out validI

抱歉,重复的问题,我看了类似的Qs,只是感到困惑。我有一个方法,提示用户输入5个不同的属性值,并希望返回所选的值,以便在程序中用于以后的决策

while (true)
{
    Console.Write("Please enter a value between 0-10 for ingenuity: ");
    inputIngenuity = Console.ReadLine();
    if (!UInt32.TryParse(inputIngenuity, out validIngenuity))
    {
        Console.WriteLine();
        Console.WriteLine("Input was not a valid value for ingenuity.");
    }
    else if (validIngenuity < 0 || validIngenuity > 10)
    {
        Console.WriteLine();
        Console.WriteLine("Input was not a valid value for ingenuity.");
    }
    else if (validIngenuity > (attributePoints - validStrength - validIntelligence - validPersonality - validSpeed))
    {
        Console.WriteLine();
        Console.WriteLine("You do not have enough attribute points remaining.");
    }
    else break;
}
Console.WriteLine();
Console.WriteLine("You have " + (attributePoints - validStrength - validSpeed - validPersonality - validIntelligence - validIngenuity) + " attribute points remaining");
Console.WriteLine();
Console.WriteLine(String.Format("Strength Value     =   {0}", validStrength));
Console.WriteLine(String.Format("Speed Value        =   {0}", validSpeed));
Console.WriteLine(String.Format("Intelligence Value =   {0}", validIntelligence));
Console.WriteLine(String.Format("Personaility Value =   {0}", validPersonality));
Console.WriteLine(String.Format("Ingenuity Value    =   {0}", validIngenuity));
Console.WriteLine();
Console.WriteLine("These are your attributes!");

while (true)
{

    Console.Write("Do you accept these? Type 1 for Yes, Type 2 for No. If No then choose again:  ");
    areYouHappyWithChoices = Console.ReadLine();
    if (!UInt32.TryParse(areYouHappyWithChoices, out validChoices))
        Console.WriteLine("Please try again. Enter 1 for Yes and 2 for No");
    else if (validChoices > 2 || validChoices < 1)
        Console.WriteLine("Please try again. Enter 1 for Yes and 2 for No");
    else if (areYouHappyWithChoices == "2")
        chooseAttributePoints(); //this method contains the whole routine
    else
        Console.WriteLine("We may now begin the game!");
    break;
}
UInt32[] attributePointArray = new UInt32[5] { validStrength, validSpeed, validIntelligence, validPersonality, validIngenuity };
return attributePointArray;
while(true)
{
Console.Write(“请输入一个介于0-10之间的值,以显示灵巧性:”);
InputGenuity=Console.ReadLine();
if(!UInt32.TryParse(输入正确性,输出有效性))
{
Console.WriteLine();
WriteLine(“输入不是ingenuity的有效值。”);
}
否则如果(有效性<0 | |有效性>10)
{
Console.WriteLine();
WriteLine(“输入不是ingenuity的有效值。”);
}
else if(validEnuity>(属性点-validStrength-validIntelligence-validPersonality-validSpeed))
{
Console.WriteLine();
WriteLine(“您没有足够的属性点剩余。”);
}
否则就断了;
}
Console.WriteLine();
WriteLine(“您有”+(属性点-有效强度-有效速度-有效个性-有效智能-有效准确度)+“剩余属性点”);
Console.WriteLine();
WriteLine(String.Format(“强度值={0}”,validStrength));
WriteLine(String.Format(“速度值={0}”,validSpeed));
WriteLine(String.Format(“Intelligence Value={0}”,validIntelligence));
WriteLine(String.Format(“personality Value={0}”,validPersonality));
WriteLine(String.Format(“Ingenuity Value={0}”,validIngenuity));
Console.WriteLine();
WriteLine(“这些是您的属性!”);
while(true)
{
控制台。写下(“您接受这些吗?键入1表示是,键入2表示否。如果否,请再次选择:”;
areYouHappyWithChoices=Console.ReadLine();
如果(!UInt32.TryParse(您是否有选择,是否有有效选择))
Console.WriteLine(“请重试。输入1表示是,输入2表示否”);
否则如果(有效选择>2 | |有效选择<1)
Console.WriteLine(“请重试。输入1表示是,输入2表示否”);
否则如果(您是否幸福,选择==“2”)
chooseAttributePoints();//此方法包含整个例程
其他的
WriteLine(“我们现在可以开始游戏了!”);
打破
}
UInt32[]属性维护=新UInt32[5]{有效强度、有效速度、有效智力、有效个性、有效持续性};
返回属性维护;

对于其他4个属性,在方法中重复了有关ingenuity的while语句,并且没有任何问题。例如,我设想稍后的代码会根据用户的强大程度产生不同的结果。通过尝试将值放入数组,我是否朝着正确的方向前进?谢谢。

您应该创建一个对象类型来包装要返回的属性。方法的返回类型将是新创建的对象类型。

这是一种方法,但是我认为最好创建一个类或结构来表示数据。这样,您将保持数据的“强类型性”和上下文,而不仅仅是一个数组索引

例如:

public class Person
{
    public int Strength { get; private set; }
    public int Speed { get; private set; }
    public int Intel { get; private set; }
    public int Personality { get; private set; }
    public int Ingenuity { get; private set; }

    public Person (int strength, int speed, int intel, int personality, int ingenuity)
    {
        this.Strength = strength;
        this.Speed = speed;
        this.Intel = intel;
        this.Personality = personality;
        this.Ingenuity = ingenuity;
    }
}
然后分配给阵列:

UInt32[] attributePointArray = new UInt32[5] { validStrength, validSpeed, validIntelligence, validPersonality, validIngenuity };
        return attributePointArray;
更新为:

return new Person(validStrength, validSpeed, validIntelligence, validPersonality, validIngenuity);
您的返回类型需要从
uint[]
更改为
Person


这样,您就不用记住
returnedArray[1]
就是速度(或其他任何东西)-您只需使用
returnedPerson即可。速度

您的代码是否不起作用,或者您只是在询问如何进行的建议?数组似乎是返回多个值的好方法。键/值对可能在可维护性方面做得更好。您是否考虑过使用
词典
?(也就是说,如果您想让它“非强类型”)数组工作,另一个选项是创建一个具有五个属性的类。通常,除非您的编码标准或自定的可读性准则另有建议,
UInt32
在C#中变成
uint
。我收到一个错误,因为它当前写在最后一行无法将类型“uint[]”隐式转换为“uint”。我正在写一本C#书的介绍,也会跳到课堂创作一章,尝试一下这个建议。我只是想确保,如果在游戏的后期,需要一个强度值6来做一些事情,代码可以引用这个方法中选择的任何值,并相应地进行处理。但是@Thomas,如果类型增长,或者其他地方需要类型安全,该怎么办?如果它确实是简单属性(即字段)的包装器,那么结构甚至可能有意义,就像Kritner在我停止使用
Tuple
s中提到的那样。它们一点也没有表现力。将属性称为
Item1
Item2
等是令人困惑的。最好创建一个具有描述性属性名称的类,如
Ingenuity
Intelligence
,等等。谢谢你,我会尝试一下。我创建了一个新类,并根据你的建议更新了我的代码,现在在“返回新人”行中出现错误参数1:无法通过参数5从'uint'转换为'int'等。我尝试将任何uint变量切换为int,但仍然存在错误。我做错了什么?你不能混合和匹配
int
uint
然后选择其中一个并相应地更新你的类型。我的代码只是作为一个示例,但是如果给出错误消息,您应该能够理解它。为了更好地适应您当前发布的代码,我的类应该由
uint
属性组成。你没有公布你的全部方法,所以我不能给出更多的建议。