在多维列表的特定行中查找值

时间:2014-09-01 05:36:46

标签: c# matlab multidimensional-array find

我想在C#(List<List<List<double>>>)中查找3D列表的所有值(索引),但只搜索特定区域。

在matlab中,可以通过以下行完成:

find(my3DList(:,4,:) == 2)

这意味着,搜索第二个维度设置为4的所有位置。我想在C#中使用List进行搜索。我想FindAll命令可以这样,但我不知道如何告诉程序将第二个维度修复为特定值。

你能帮忙吗? 非常感谢

2 个答案:

答案 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)。