【问题标题】:How to return named tuples in C#?如何在 C# 中返回命名元组?
【发布时间】:2023-03-03 02:01:01
【问题描述】:

我有一个属性,它返回两个DateTime 类型的项目。返回这些值时,我必须将它们引用为Item1Item2。如何使用自定义名称返回,例如

filter?.DateRanges.From
filter?.DateRanges.To

 

public Tuple<DateTime, DateTime> DateRanges
{
    get
    {
        From = DateTime.Now.AddDays(-1).Date.AddMonths(-1);
        To = DateTime.Now.AddDays(-1).Date;

        if (Preset != 0)
        {
            if (Preset == DatePreset.SpecificRange)
            {
                From = From.Date;
                To = To.Date;
            }
            else
            {
                var dateRange = DateTime.Today.AddDays(-1).GetDateRangeByPreset(Preset);
                From = dateRange.From;
                To = dateRange.To;
            }
        }

        return new Tuple<DateTime, DateTime>(From, To);
    }

用法:

var from = filter?.DateRanges.Item1;
var to = filter?.DateRanges.Item2;

【问题讨论】:

  • AFAIK 没有“命名元组”这样的东西。另一种方法是使用您想要的属性名称创建一个自定义类
  • @RuiJarimba:从 C# 7 开始,肯定有带有命名元素的 C# 元组。不过,它们使用 ValueTuple&lt;&gt; 而不是 Tuple&lt;&gt;
  • 哦,太好了,我不知道这个新功能。谢谢@DaisyShipton

标签: c# datetime get set tuples


【解决方案1】:

像这样:

public (DateTime Start, DateTime End) DateRanges
{
    get
    {
        return (DateTime.MinValue, DateTime.MaxValue);
    }
}

注意:这需要最新版本的 C# 和 .Net。

顺便提一下,注意这种使用模式:

var from = filter?.DateRanges.Start;
var to = filter?.DateRanges.End;

这是低效的,因为它会导致创建两个相同的元组。

这样更好:

var range = filter?.DateRanges;

if (range.HasValue)
{
    var from  = range.Value.Start;
    var to    = range.Value.End;
}

但请注意,元组不能为空(它们是值类型),因此您可以这样写:

if (filter != null)
{
    var range = filter.DateRanges;
    var from  = range.Start;
    var to    = range.End;
    ...
}

【讨论】:

  • 奇怪的是你的第二种方法不起作用,var range = filter?.DateRanges;范围变量不允许开始和结束
  • @KarimAli 啊,那是因为它是可空的(带有?)所以我应该一直使用.Value。我已经编辑了我的答案。但实际上在这里使用可空值是没有意义的,因为元组不能为空。
  • 这不是被问到的。您的答案不仅仅是语法差异,它是 Tuple 语法不引用的值类型。
  • @JohnStock 我在我的回答中指出这是一种值类型,我说(they are value types),所以它们是值类型这一事实应该不会让任何人感到惊讶。我什至加粗了我说tuples cannot be null的部分。
  • @MatthewWatson 感谢您指出如何通过调用 DateRanges 方法两次从而创建 2 个元组来滥用代码(降低效率)。并进一步提供更好的“使用”建议。虽然您创建 2 个元组的事实通过检查有些明显,但很容易被忽略 - 尤其是当您使用其他人编写的代码时!
【解决方案2】:
class Program
{
    static void Main(string[] args)
    {
        test t = new test();
        Console.WriteLine(t.NamedTuple.start);
        Console.WriteLine(t.NamedTuple.stop);
        Console.Read();
    }
}

class test
{
    DateTime From;
    DateTime To;

    public (DateTime start, DateTime stop) NamedTuple
    {
        get
        {
            From = DateTime.Now.AddDays(-1).Date.AddMonths(-1);
            To = DateTime.Now.AddDays(-1).Date;
            return (From, To);
        }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多