C# LINQ如何从LINQ返回多维数组

5

我想返回一个多维数组以保存在会话中,但不确定如何从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??
}

我知道我在这里做错了什么,只是不确定是什么。

编辑:

需要返回以下字段- xy.Name,xz.Description

例如:

 { "1", "aaa" },
   { "2", "bbb" }

编辑:

我尝试了下面的示例,但它们还没有达到我需要的效果 - 我认为像下面这样的东西应该可以工作:

 /// <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;

    }

但它抱怨返回的数组;

编辑:

我得到的最接近的答案是以下内容:

/// <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 };
    }

但是这会返回两个数组:
 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

4
string[] 是一个一维数组。你的方法返回类型是否有误? - Andrew Whitaker
我必须说,我们应该仅在进行矩阵计算时使用多维数组。否则,请改用**嵌套的List<>**。 - King King
你的查询返回了一个具有两个属性的匿名对象,但是方法应该返回一个字符串数组。你需要将匿名对象转换为字符串。 - Sergey Berezovskiy
4个回答

12

锯齿数组。

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();  
}

多维数组

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;
}

以上方法取自John Skeet为问题如何将数组列表转换为多维数组提供的答案之一。


一些小问题:那不是多维数组,而是交错数组。 - sloth
使用上述代码,我得到了一个错误:无法在查询结果中初始化数组类型'System.String[]'。请考虑改用'System.Collections.Generic.List`1[System.String]'。 - anna
@Damith 最后一件事,在重新审视这个问题后,似乎数组有时会混淆,而不是带回 select new List<string> { xz.Description, xy.Name }).ToArray(); 它带回了描述、描述、名称、名称、名称、描述、描述等,而不是描述、名称、描述、名称等。我不确定原因-如果我在SQL中运行查询,我会看到我期望的描述-描述-名称。 - anna

2
最佳实践是使用具有定义成员的 List<>。
public class Results
{
    public string name {get; set;}
    public string description {get; set;}
}

使用Damith的示例时失败了,说我需要使用list<>。user2795707,你能提供一个例子吗? - anna

2
个人喜好,但我认为我会选择这种方式。
    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;
    }

原因是如果您添加第三个字段(或更多),消耗您的 string[][] 的代码将会出错。


1
对于+1,提供一种避免可避免的破坏的解决方案,例如string [] []。 (请原谅语法。即使有详细的评论,过滤器也不允许+1作为第一个单词,但不会注意到+1在第一个单词之后。) - Marjan Venema
为什么不是“加一分给...”呢? :-) - Mark Good

0
    public class UserData
    {
        public string Name;
        public string Description;
    }

    public List<UserData> GetCountryAndManufacturerForUser(int userId) {
        List<UserData> userdatas = new List<UserData>;
        userdatas = (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 { 
                Name = xy.Name, 
                Description = xz.Description 
                }).ToList();   
        return userdatas ;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接