c# linq return a multidimensional array from linq

17,289

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.

Share:
17,289
anna
Author by

anna

Updated on June 08, 2022

Comments

  • anna
    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