我有一个阵列
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;
}
答案 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();
}