c# linq return a multidimensional array from linq
Solution 1
Jagged array.
public string[][] GetCountryAndManufacturerForUser(int userId)
{
return (from xx in _er.UserRoles
join xy in _er.Countries on xx.CountryId equals xy.Id
join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id
where xx.UserId == userId
select new string[]{ xy.Name, xz.Description }).ToArray();
}
Multidimensional array
public string[,] GetCountryAndManufacturerForUser(int userId)
{
var array =(from xx in _er.UserRoles
join xy in _er.Countries on xx.CountryId equals xy.Id
join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id
where xx.UserId == userId
select new List<string>{ xy.Name, xz.Description }).ToArray();
return CreateRectangularArray(array);
}
static T[,] CreateRectangularArray<T>(IList<T>[] arrays)
{
// TODO: Validation and special-casing for arrays.Count == 0
int minorLength = arrays[0].Count();
T[,] ret = new T[arrays.Length, minorLength];
for (int i = 0; i < arrays.Length; i++)
{
var array = arrays[i];
if (array.Count != minorLength)
{
throw new ArgumentException
("All arrays must be the same length");
}
for (int j = 0; j < minorLength; j++)
{
ret[i, j] = array[j];
}
}
return ret;
}
Above method taken from one of answer by John skeet for the Question How to convert list of arrays into a multidimensional array
Solution 2
the best practice is to use a List<> with defined members
public class Results
{
public string name {get; set;}
public string description {get; set;}
}
Solution 3
Personal preference, but I think I'd go down this route
public class UserData
{
public string Name;
public string Description;
}
public UserData[] GetCountryAndManufacturerForUser(int userId)
{
var array = (from xx in _er.UserRoles
join xy in _er.Countries on xx.CountryId equals xy.Id
join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id
where xx.UserId == userId
select new UserData() { xy.Name, xz.Description }).ToArray();
return array;
}
Reason being if you ever add a third field (or more) the code that consumes your string[][] will break.
anna
Updated on June 08, 2022Comments
-
anna almost 2 years
I want to return a multidimensional array to hold in a session but not sure how to return it from linq:
public string[] GetCountryAndManufacturerForUser(int userId) { var array = (from xx in _er.UserRoles join xy in _er.Countries on xx.CountryId equals xy.Id join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id where xx.UserId == userId select new { xy.Name, xz.Description }).ToArray(); return?? }
i know i m doing something wrong here just not sure what.
Edit:
The following fields need to be returned - xy.Name, xz.Description
like:
{ "1", "aaa" }, { "2", "bbb" }
Edit:
I have tried the example below and they haven t quite got to where i need to be - i thought something like the following should work:
/// <summary> /// /// </summary> /// <param name="userId"></param> /// <returns></returns> public string[,] GetCountryAndManufacturerForUser(int userId) { var array = (from xx in _er.UserRoles join xy in _er.Countries on xx.CountryId equals xy.Id join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id where xx.UserId == userId select new { xy.Name, xz.Description }).ToArray(); return array; }
But it complains about return array;
Edit:
The closest i ve got is the following:
/// <summary> /// /// </summary> /// <param name="userId"></param> /// <returns></returns> public string[][] GetCountryAndManufacturerForUser(int userId) { //var array = (from xx in _er.UserRoles // join xy in _er.Countries on xx.CountryId equals xy.Id // join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id // where xx.UserId == userId // select new { xy.Name, xz.Description }).ToArray(); var countryArray = (from xx in _er.UserRoles join xy in _er.Countries on xx.CountryId equals xy.Id join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id where xx.UserId == userId select xy.Name).ToArray(); var manufacturerArray = (from xx in _er.UserRoles join xy in _er.Countries on xx.CountryId equals xy.Id join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id where xx.UserId == userId select xz.Description).ToArray(); // return array; return new string[][] { countryArray, manufacturerArray }; }
but this return two array :
var userManuCountry = _userRoleRepository.GetCountryAndManufacturerForUser(u.Id); userManuCountry {string[2][]} string[][] [0] {string[6]} string[] [0] "Germany" string [1] "France" string [2] "United Kingdom" string [3] "Netherlands" string [4] "United States" string [5] "United Kingdom" string - [1] {string[6]} string[] [0] "Dove" string [1] "Dove" string [2] "Dove" string [3] "Dove" string [4] "Dove" string [5] "Sure" string