Craig
Craig

Reputation: 18684

Return 2 values from a function?

I have an object that represents a scheduled payment. My database has a list of these payments, but I have one instance of a payment.

I need to write a method that gets the next payment after the one I have, as well as the previous date of the previous payment.

I'd like to write a method that return the two dates. But the return type of 'DateTime' only allows for one. I could return a List<DateTime> but that seems strange and ma be ambiguous. Which is the previous and which is the next?

I can also create a DTO object that has:

DateTime previousPayment {get; set;}
DateTime nextPayment {get; set;}

Tuple<DateTime, DateTime> might be another options, but it too is ambiguous. Unless I can name the properties of it?

But - is there a better way to allow for a method to return two dates? Anonymous types or something?

Upvotes: 0

Views: 80

Answers (4)

Levi Fuller
Levi Fuller

Reputation: 15631

Use the "ref" modifier. (You may use "out" instead if you do not need to read the variable before it is assigned)

public void GetNextPayment(ref DateTime previousPayment, ref DateTime nextPayment){
    // do stuff here
}

Usage:

DateTime previousPayment = DateTime.Now(); //Example
DateTime nextPayment = DateTime.Now(); // example
GetNextPayment(ref previousPayment, ref nextPayment); // Forgot to add "ref" when calling it

previousPayment and nextPayment will be modified in the function and maintain the value.

Update with Dictionary

As Anik mentioned, it might be better to use a Dictionary;

public Dictionary<string,DateTime> GetNextPayment(DateTime previousPayment, DateTime nextPayment){
    // modify payments
    Dictionary<string,DateTime> myDict = new Dictionary(string, DateTime);
    myDict.Add("PreviousPayment", [date]);
    myDict.Add("NextPayment", [date]);
    return myDict;
}

Use Class

Ilya. N. mentioned to use a class. I would have to agree with this if you're going to have lots of payment objects going to be used more than once. But I firmly believe it's better to give you all the tools available at your disposal because you never know when you might want to use out parameters or Dictionaries.

public class Payment {
    public string Name {get;set;}
    public DateTime previousPayment {get;set;}
    public DateTime nextPayment {get;set;}

    public GetNextPayment(){
        // code to get the next payment
        this.previousPayment = //whatever
        this.nextPayment = //whatever
    }
}

If you only have ONE payment you are going to be using, like ever. (good to future proof with a class), then you might use a method or dictionary.

Upvotes: 3

user4093832
user4093832

Reputation:

try this ...

private void Form1_Load(object sender, EventArgs e)
    {
        DateTime previousPayment =new DateTime();
        DateTime nextPayment=new DateTime();
        getdate(ref previousPayment, ref nextPayment);
    }
    public void getdate(ref  DateTime previousPayment, ref DateTime nextPayment)
    {
        previousPayment = System.DateTime.Now;
        nextPayment = System.DateTime.Now.AddDays(1);

    }

Upvotes: 0

IKnowledge
IKnowledge

Reputation: 221

Why not simply return a class?

public class DateCombo {
DateTime PreviousPayment {get; set;}
DateTime NextPayment {get; set;}

}

Upvotes: 1

Matt Jacobi
Matt Jacobi

Reputation: 864

Besides the two options you listed, there are two more:

  1. Return a Tuple<DateTime, DateTime>
  2. Use out parameters

Upvotes: 1

Related Questions