c# - 如何使用 Tuple 返回 2 个或 3 个值?

标签 c# return tuples

所以我正在用 C# 制作一个愚蠢的游戏,但我有点卡在这里。

我正在尝试返回 2 个值或 3 个值,具体取决于游戏规则。

我需要知道如何在一个函数中返回不同数量的值。就像有时我需要在一个函数中返回 3 个值,有时需要返回 7 个值......。

当然,错误出在变量 tuple 上,因为我不能返回少于 3 个值..

public Tuple<int, int, int> movepion(schaken.pion pion, int row, int column)
{
    int row2 = row + 1;

    //posities berekenen
    if (pion.kleur == Color.Blue)
    {
        if (pion.volgnr == 0) { row++; row2++; }
        else { row++; }
    }
    else
    {
    }

    // declaration
    var tuple = new Tuple<int, int>(row, column);
    var tuple2 = new Tuple<int, int, int>(row, row2, column);

    // what position?
    if (pion.volgnr == 0)
    {
        pion.volgnr = pion.volgnr + 1;
        return tuple2;
    }
    else
    {
        return tuple;
    }
}

最佳答案

返回一个集合而不是 Tuple<>

public IEnumerable<int> movepion(schaken.pion pion, int row, int column)
{
    IEnumerable<int> result;
    bool return2Items = false; //Some logic part to decide how many items to return
    if(return2Items)
        result = new List<int> { 1, 2 };
    else
        result = new List<int> { 1, 2, 3 };

   return result;    
}

在更好地理解评论之后,我建议创建一个对象 MoveOption并且该函数将返回 IEnumerable<MoveOption>

public class MoveOption
{
    public int X { get; set; }
    public int Y { get; set; }
}

然后在你的函数中:

public IEnumerable<MoveOption> movepion(schaken.pion pion, int row, int column)
{
    List<MoveOption> options = new List<MoveOption>();

    if(/*some condition*/)
    {
        options.Add(new MoveOption{ X = 1, Y = 2 });
    }

    if(/*some condition*/)
    {
        options.Add(new MoveOption{ X = 5, Y = 7 });
    }

    //Rest of options

    return options;
}

然后如果你想更进一步,你可以使用继承和:

public interface IMoveOptionCalcumator
{
    public MoveOption Calculate(/*input*/);
}

public class MoveOptionX : IMoveOptionCalcumator
{
    public MoveOption Calculate(/*input*/) { /*some implementation*/ }
}

在你的函数中:

public class YourClass
{
    public IEnumerable<IMoveOptionCalcumator> MoveOptionCalculators { get; set; }

    public YourClass()
    {
        // Initialize the collection of calculators 
        // You can look into Dependency Injection if you want even another step forward :)
    }


    public IEnumerable<int> movepion(schaken.pion pion, int row, int column)
    {
        List<MoveOption> options = new List<MoveOption>();
        foreach (var item in MoveOptionsCalculators)
        {
            var result = item.Calculate(/*input*/);
            if(result != null)
            {
                options.Add(result);
            }
        }
        return options;
    }
}

关于c# - 如何使用 Tuple 返回 2 个或 3 个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39039128/

相关文章:

swift - 无法理解 Swift Tuple 比较

c# - 使用通用参数获取/计算 .NET 类型的外部 MSDN url

关于返回声明的困惑

python - 为什么我的递归二分搜索函数没有返回任何内容?

java - 我需要帮助才能返回

python - 如何将元组解压缩为比元组更多的值?

c# - .net core 3,MVC,使用端点路由时不支持使用 'UseMvcWithDefaultRoute' 配置 MVC

c# - Nuget 恢复错误 : This folder contains more than one solution file

c# - .NET Framework 版本冲突问题

c++ - 将变体数组转换为 std::tuple