【问题标题】:Dart: access a colum of List of ListsDart:访问列表列表的列
【发布时间】:2020-04-21 04:36:21
【问题描述】:

我创建了以下列表:

  List files = <List>[
    ["File1.jpg", "Name 1"],
    ["File2.jpg", "Name 2"],
    ["File3.jpg", "Name 3"],
  ];

这个列表背后的想法是访问显示在 ListView 上的一些文件并显示一些标题而不是文件名。

有没有办法按列访问元素?

正如post 中提到的,我可以通过以下方式访问单个元素:

 files[0][0] = "File1.jpg";

但想从上面的列表中获得以下信息:

["File1.jpg", "File2.jpg", "File3.jpg"] // and
["Name 1", "Name 2", "Name 3"] 

类似:files[all rows][0]files[all rows][1]

我需要这个或类似的东西,因为我已经按名称实现了一个搜索栏,所以当我搜索“2”时,我可以得到["File2.jpg", "Name 2"]

【问题讨论】:

    标签: list flutter dart


    【解决方案1】:

    您可以对列表进行预处理,从而为您提供如下所示的列:

      var files = <List>[
        ['File1.jpg', 'Name 1'],
        ['File2.jpg', 'Name 2'],
        ['File3.jpg', 'Name 3'],
      ];
    
      var col0 = files.map<String>((row) => row[0]).toList(growable: false);
      var col1 = files.map<String>((row) => row[1]).toList(growable: false);
    

    col0col1 现在是 List&lt;String&gt;,值按列排列。

    考虑使用where 来选择特定匹配(您可以定义“匹配”的含义)行。例如:

      var criterion = '2';
      var selected = files.where((row) {
        for (var col in row) {
          if (col.contains(criterion)) {
            return true;
          }
        }
        return false;
      }).toList();
      print (selected);
    

    【讨论】:

      【解决方案2】:

      以下是在数组中查找值的一些方法。

      void main() {
        final result1 = search1(files, '2');
        print(result1);
        final result2 = search1(files, '2');
        print(result2);
        final result3 = search3(files, [0, 1], '2');
        print(result3);
      }
      
      Iterable<Iterable<String>> search1(List<List<String>> source, String word) {
        return source.where((e) => e.any((e) => e.contains(word)));
      }
      
      Iterable<Iterable<String>> search2(List<List<String>> source, String word) {
        return source.where((e) => e[0].contains(word) || e[1].contains(word));
      }
      
      Iterable<Iterable<String>> search3(
          List<List<String>> source, List<int> columns, String word) {
        return source.where((e) => columns.any((c) => e[c].contains(word)));
      }
      
      final files = [
        ['File1.jpg', 'Name 1'],
        ['File2.jpg', 'Name 2'],
        ['File3.jpg', 'Name 3'],
      ];
      

      结果:

      ([文件2.jpg,名称2]) ([文件2.jpg,名称2]) ([文件2.jpg,名称2])

      【讨论】:

        猜你喜欢
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 2020-12-19
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多