如何在RethinkDB中获取给定谓词上元素的索引

时间:2019-03-23 21:16:14

标签: c# rethinkdb

你好,我有一个table,我想在给定文档后获取所有documents

问题是我没有看到skipwhile功能,您给了predicate。 因此,我不得不求助于首先找到给定元素的索引。这是如何实现的?

示例:鉴于文档{"a":1 }{"b":2}{"a":33}{"c":44}{"d":33},我想拿走所有最后一个a之后的元素,因此我想获得:[ {"c":44},{"d":33}]

这是可以通过RethinkDB驱动程序实现的,还是我在处理完所有表格后需要解决此问题。

3 个答案:

答案 0 :(得分:1)

  

所以我不得不求助于首先找到给定元素的索引。怎么样   那可以实现吗?

您可以使用offsetsOf()功能。它返回与您的搜索元素匹配的索引数组。您可以按以下方式获取{"a":33}文档的索引:

r.expr([{"a":1 },{"b":2},{"a":33},{"c":44},{"d":33}])
  .offsetsOf({"a":33}).nth(0)

要进一步遍历其余元素,可以使用r.range()函数,如下所示:

r.expr([{"a":1 },{"b":2},{"a":33},{"c":44},{"d":33}])
    .do(function(docs){
      return docs.offsetsOf({"a":33}).nth(0)
        .do(function(index){
          return r.range(index.add(1), docs.count())
            .map(function(i){
              return docs.nth(i)
            })
        })
    })

答案 1 :(得分:0)

尝试以下代码:

            List<KeyValuePair<string, int>> input = new List<KeyValuePair<string, int>>() {
                new KeyValuePair<string, int>("a", 1),
                new KeyValuePair<string, int>("b", 2),
                new KeyValuePair<string, int>("a",33),
                new KeyValuePair<string, int>("c",44),
                new KeyValuePair<string, int>("d",33)
            };

            int skipIndex = input.Select((x, i) => new { value = x, index = i }).Where(x => x.value.Key == "a").Last().index;
            List<KeyValuePair<string, int>> results = input.Skip(skipIndex + 1).ToList();

答案 2 :(得分:0)

按照您提出的示例,我试图保存您的问题:

  

-我有一个包含以下文件/文档的文件夹{a.txt,b.txt,c.txt,d.txt,f.txt}

     

-我希望在-count-(出现在GetFilesAfterFilename函数中)时间之后出现名称为“ b.txt”的所有文件的数组。


using System;
using System.Collections.Generic;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo DirectoryOfDocuments = new DirectoryInfo(Environment.CurrentDirectory+ @"\documents");//Get direcory with your files(Ex: a.txt,b.txt,c.txt,d.txt,..)
            FileInfo[] OldFileInfo = DirectoryOfDocuments.GetFiles();//Get all files out of your directory

            FileInfo[] NewFileInfo = GetFilesAfterFilename(OldFileInfo, 1, "c.txt");

            foreach (FileInfo fi in NewFileInfo)
            {
                Console.WriteLine(fi.ToString());
            }
            Console.Read();
        }

        static FileInfo[] GetFilesAfterFilename(FileInfo[] OriginArray, int count, string FileName) {
            List<FileInfo> NewFileInfo = new List<FileInfo>();
            int FileNameOccurrence = 0;
            foreach (FileInfo fi in OriginArray)
            {
                if (FileNameOccurrence == count){//Add all Files from OriginArray after [count] time occurrence of somewhat file/document
                    NewFileInfo.Add(fi);
                }else if (fi.ToString()==FileName) {
                    FileNameOccurrence++;
                }
            }

            return NewFileInfo.ToArray();
        }
    }
}


控制台输出
d.txt
f.txt