Himani
Himani

Reputation: 173

How to return a string and a list of elements together in c#?

Is there any way to return a string parameter and a list to the method in c#?

List<cCountry> countries = new List<cCountry>();
            countries = GetCountries(userProfile.Country);


     private List<cCountry> GetCountries(string p)
            {
                inputCollection = new cDTOCollection<cDTOBase>();
                outputCollection = new cDTOCollection<cDTOBase>();
                outputCollection = UpdateProfileBizobj.ProcessRequest(ActionConstants.ActionGetCountriesList, null);
                List<cCountry> countries = new List<cCountry>();
                cDTOSingleValue SelectedCountryID = new cDTOSingleValue();
                foreach (cDTOCountry countryItem in outputCollection)
                {
                    if (p == countryItem.CountryName)
                        SelectedCountryID.Id = countryItem.CountryID;

                    countries.Add(Mapper.Map<cDTOCountry, cCountry>(countryItem));
                }
                countries.Remove(countries[0]);
                return countries;
            }

Like in the method above I need to return a parameter SelectedCountryID and also the countries list.Is there any way to return both?

Upvotes: 1

Views: 99

Answers (4)

ryanyuyu
ryanyuyu

Reputation: 6486

Answer to your question

You can also use the out modifier on a parameter to pass by reference, which would let the method modify the resulting object, effectively returning it. That's a pretty bad design for most cases though, and you probably refactor your methods into smaller pieces or wrap things up into better objects.

In your code:

private List<cCountry> GetCountries(string p, out cDTOSingleValue SelectedCountryID)
{
      //your code
}

Potential Refactoring

Looking at your code it, seems your really are trying to do two separate things.

  • Getting Countries and mapping them
  • Finding the last country whose name matches the parameter passed in

So as long as your country list isn't ridiculously large, making two separate method calls will make your code more readable and more maintainable. I like using LINQ to manipulate the in-memory collections.

I'd personally use one method to fetch the data.

private List<cDTOCountry> GetCountries()
{
    inputCollection = new cDTOCollection<cDTOBase>();
    outputCollection = new cDTOCollection<cDTOBase>();
    return UpdateProfileBizobj.ProcessRequest(ActionConstants.ActionGetCountriesList, null);
}

And then later I'd process the data as needed:

var preMappedCountries = GetCountries();
var mappedCountries = preMappedCountries
       .Select(c => Mapper.Map<cDTOCountry, cCountry>(c)) //map the data
       .Skip(1) //skip the first element (the remove index 0)
       .ToList(); //cast to List.  Read more on LINQ's deferred execution.
var lastMatchingName = preMappedCountries
       .LastOrDefault(c => c.Name == p); //gets the last country with matching name

The benefit to separating the logic into pieces is potential reuse of methods. If you ever find yourself needing to get data without mapping, you can do just that and skip all the LINQ logic. This way the logic that gets data is distinct from the logic that matches country names.

Upvotes: 2

user1666620
user1666620

Reputation: 4808

populate and return an object instead.

public class ReturnObject
{
    public List<cCountry> Countries { get; set; }
    public guid SelectedCountryID { get; set; } // don't think you defined what type SelectedCountryID is in your question
}

But if you find yourself needing to return more than 1 thing, it's probably an indication that your method is doing too much and should be refactored.

Why can't you reuse the value that you are sending to the method?

Upvotes: 7

Sandeep
Sandeep

Reputation: 399

In your case an out param seems more appropriate. Otherwise as Kevin suggested you can return a Tuple.

Upvotes: 1

Kevin
Kevin

Reputation: 2291

   return Tuple.Create(new List<Country>(),"astring")

Upvotes: 4

Related Questions