How to return named tuples in C#?
Sebastian Wright
I have a property that returns two items of type DateTime. When returning these values I have to reference them as Item1 and Item2. How do I return with custom names e.g.
filter?.DateRanges.From
filter?.DateRanges.Topublic 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); }usage:
var from = filter?.DateRanges.Item1;
var to = filter?.DateRanges.Item2; 4 2 Answers
Like this:
public (DateTime Start, DateTime End) DateRanges
{ get { return (DateTime.MinValue, DateTime.MaxValue); }
}Note: This requires a recent version of C# and .Net.
Incidentally, watch out for this usage pattern:
var from = filter?.DateRanges.Start;
var to = filter?.DateRanges.End;That's inefficient because it causes two identical tuples to be created.
This is better:
var range = filter?.DateRanges;
if (range.HasValue)
{ var from = range.Value.Start; var to = range.Value.End;
}However note that tuples cannot be null (they are value types) so you could write it like so:
if (filter != null)
{ var range = filter.DateRanges; var from = range.Start; var to = range.End; ...
} 5 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); } }
}