灌浆/分拣/分裂2D清单/阵列

时间:2015-06-01 10:43:39

标签: c# linq multidimensional-array

我有跟随2D数组

var array1 = new string[][]
            {
              new string[] {A,B,C},
              new string[] {A,X,Y},
              new string[] {D,L,K},
              new string[] {A,X,W}

            };

最后我想对这个列表和输出进行排序或分组,我希望在桌面上的MVC视图中显示如下

A / X / Y,W

/ B / C

D / l / K

我不想在列中显示重复的元素。所以它就像灌浆一样。

  • 如何使用linq将结果分组到控制器中。
  • 如果我可以按第一个元素排序,然后按第二个等排序,那么排序也可能会有所帮助。
  • 如果我能分成3个1D阵列,另一个想法也有效吗?所以最后我会得到array1 = {A,A,D,A},array2 = {B,X,L,X},array3 = {C,Y,K,W}

感谢。

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

var array1 = new string[][]
{
    new string[] {"A","B","C"},
    new string[] {"A","X","Y"},
    new string[] {"D","L","K"},
    new string[] {"A","X","W"},
};

var s = array1.Select(a => string.Concat(a)).ToList();          
s.Sort();
// Now you have them sorted as a list of strings, do what you want...

这不会限制你3个条目(不像硬编码[0],[1]等...)

答案 1 :(得分:1)

您的问题应该分为两个子问题。首先,您需要对array1进行排序;第二,您需要array1使用array1已排序的事实。

您不能使用分组而不是排序,因为分组并不能保证具有相同第一个元素的子数组会相互跟随。

var array1 = new List<IList<string>>
{
    new List<string> {"A", "X", "Y"}, 
    new List<string> {"A", "X", "W"}, 
    new List<string> {"A", "B", "C"}, 
    new List<string> {"D", "L", "K"}, 
};

var array2 = from a in array1
    orderby a[0], a[1], a[2]  
    select a;

var array3 = array2.ToList();

现在你可以在Razor中使用array2

@if (array2.MoveNext())
{
   @array2.Current[0], @array2.Current[1], @array2.Current[3]<br />

   var lastElement = array2.Current;
   while (array2.MoveNext())
   {
     if (array2.Current[0] != lastElement[0])
     {
       @array2.Current[0],
     }
     else if (array2.Current[1] != lastElement[0])
     {
       @array2.Current[1],
     }

     @array2.Current[2]
     lastElement = array2.Current;
   }
}