我想在C#(List<List<List<double>>>
)中查找3D列表的所有值(索引),但只搜索特定区域。
在matlab中,可以通过以下行完成:
find(my3DList(:,4,:) == 2)
这意味着,搜索第二个维度设置为4的所有位置。我想在C#中使用List进行搜索。我想FindAll
命令可以这样,但我不知道如何告诉程序将第二个维度修复为特定值。
答案 0 :(得分:0)
假设您有一个三维数据结构,如:
List<List<List<int>>> a = new List<List<List<int>>>()
{
new List<List<int>> {
new List<int> {1,2,3},
new List<int> {4,5,6},
new List<int> {7,8,9},
},
new List<List<int>> {
new List<int> {10,11,12},
new List<int> {13,14,15},
new List<int> {16,17,18},
}
};
要将搜索范围限制在此数据结构中的维度,您需要一个帮助方法来展平您的列表。
private static IEnumerable<int> LimitToDimension(IEnumerable<IEnumerable<IEnumerable<int>>> list, int dimension, int index)
{
return (dimension == 0 ? list.Where((x, i) => i == index) : list)
.SelectMany(secondDimension => dimension == 1 ? secondDimension.Where((x, i) => i == index) : secondDimension)
.SelectMany(thirdDimension => dimension == 2 ? thirdDimension.Where((x, i) => i == index) : thirdDimension);
}
此方法采用3D IEnumerable,过滤维度和维度索引,并返回该维度和索引中的项目的展平列表。例如,调用:
LimitToDimension(a, 1, 1);
返回{4,5,6,13,14,15},你可以使用'Where'找到你想要的元素。此外,您可以将其转换为扩展方法,以便于使用。
答案 1 :(得分:0)
您可以使用以下
var result = list.FindAll(x=>x[4].Contains(6)); // result contains matched elements not indices
此处4固定在第二维,如果它包含6则将被检索。
修改强> 如果你只需要索引,你可以按照以下方式进行
int[] indices = list.Select((item, index) => new { x = item, i = index })
.Where(x => x.x[4].Contains(6))
.Select(x => x.i).ToArray();
编辑2 用于固定第三维(此处0为固定且6为匹配)
var result = list.Where(x => x.Where(y => y[0] == 6).Count() != 0).ToList();
编辑3 用于固定第三维(此处0为固定且6为匹配)且仅获取索引
int[] indices = list.Select((x, i) => new { item = x, index = i })
.Where(x => x.item.Where(y => y[0] == 6).Count() != 0)
.Select(x=>x.index).ToArray();
示例强>
如果列表中的每个元素(外部)都包含第5个(index = 4)元素,则应该提供以下工作。
List<List<List<double>>> list = new List<List<List<double>>>()
{
new List<List<double>>()
{
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){6,2,3 },
new List<double>(){5,2,5 },
},
new List<List<double>>()
{
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){6,2,3 },
new List<double>(){5,2,5 },
},
new List<List<double>>()
{
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){5,2,3 },
new List<double>(){5,2,5 },
},
new List<List<double>>()
{
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){1,2,3 },
new List<double>(){5,2,5 },
new List<double>(){5,2,3 },
new List<double>(){5,2,5 },
}
};
var result = list.FindAll(x=>x[4].Contains(6));
int[] indices = list.Select((item, index) => new { x = item, i = index })
.Where(x => x.x[4].Contains(6))
.Select(x => x.i).ToArray();
此处result
仅包含原始列表中的前2个元素,索引包含匹配的索引(0,1)。