来自锯齿状数组[] []的子数组[] []

时间:2016-03-14 05:09:46

标签: c# arrays jagged-arrays

我有一个阵列
string[][]数据如下所示:

p,x,y,w,t,p,f,c,n,n,e,e,s,s,w,w,p,w,o,p,k,s,u
e,x,s,g,f,n,f,w,b,k,t,e,s,s,w,w,p,w,o,e,n,a,g
e,x,y,y,t,a,f,c,b,n,e,c,s,s,w,w,p,w,o,p,k,n,g
e,b,s,w,t,a,f,c,b,g,e,c,s,s,w,w,p,w,o,p,k,n,m
e,b,y,w,t,l,f,c,b,n,e,c,s,s,w,w,p,w,o,p,n,s,m
p,x,y,w,t,p,f,c,n,p,e,e,s,s,w,w,p,w,o,p,k,v,g
.
.
.

列是属性(例如,第一列有2个值(p,e) 我正在尝试根据属性值创建子数组,例如。

subarray1
p,x,y,w,t,p,f,c,n,n,e,e,s,s,w,w,p,w,o,p,k,s,u
p,x,y,w,t,p,f,c,n,n,e,e,s,s,w,w,p,w,o,p,k,s,u

subarray2
e,x,s,g,f,n,f,w,b,k,t,e,s,s,w,w,p,w,o,e,n,a,g
e,x,y,y,t,a,f,c,b,n,e,c,s,s,w,w,p,w,o,p,k,n,g
e,b,s,w,t,a,f,c,b,g,e,c,s,s,w,w,p,w,o,p,k,n,m
e,b,y,w,t,l,f,c,b,n,e,c,s,s,w,w,p,w,o,p,n,s,m
.
.

我尝试了这个:

 public string[][] subSets2(string[][] _dataSet, int AttributeID, int value)
        {
            string[][] SS=new string[_dataSet.Length][];
            List<string> values=Transpose(_dataSet)[AttributeID].Distinct().ToList();
            int t= 0;
            string[][] tempSS = Transpose(_dataSet);
            for (int i= 0;i< _dataSet.Length;i++)
            {
                SS[t]= new string[_dataSet[i].Count()];
                for (int j = 0; j<_dataSet[i].Count() ; j++)
                {
                    if (_dataSet[i][j].Equals(values[value]) && AttributeID== j)
                    {
                        SS[t][j] = _dataSet[i][j];
                            t++;
                    }
                }
            }
            return SS;
        }

2 个答案:

答案 0 :(得分:2)

如果要基于给定列创建子数组,可以使用linq,如下所示:

var subarrays = _dataSet.GroupBy(r => r[0]).Select(r => r.ToArray()).ToArray();

r[0]指的是每个数组中的第一项。您可以将索引更改为按其他列分组。

答案 1 :(得分:0)

我不确定我是否理解这个问题,但如果我这样做,那么你想得到一个包含所有以特定字符串(“p”或“e”)开头的数组的锯齿状数组。
如果是这种情况,您只需使用linq的where扩展方法:

public string[][] subSets(string[][] _dataSet, string valueOfFirstCell)
{
    return _dataSet.Where(d => d[0] == valueOfFirstCell).ToArray();
}