Как получить индекс элемента по данному предикату в RethinkDB - PullRequest
0 голосов
/ 24 марта 2019

Здравствуйте, у меня есть table, где я хочу получить все documents после данного документа.

Проблема в том, что я не видел функциональность skipwhile, вы даете predicate.Поэтому я должен сначала прибегнуть к поиску индекса моего данного элемента. Как это достижимо?

Пример: Учитывая документы {"a":1 }, {"b":2}, {"a":33}, {"c":44}, {"d":33} Я хочу взять все элементы после последнего a, поэтому я хотел бы получить: [ {"c":44},{"d":33}]

Это возможно с помощью драйвера RethinkDB, или мне нужно будет решитьэто после того, как я заберу весь стол.

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Итак, я должен сначала найти индекс моего данного элемента. Как это достижимо?

Вы можете использовать функцию 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)
            })
        })
    })
0 голосов
/ 24 марта 2019

Я пытался сохранить вашу проблему, следуя примеру, который вы задали, задав свой вопрос:

-У меня есть папка со следующими файлами / документами {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
0 голосов
/ 24 марта 2019

попробуйте что-то вроде кода ниже:

            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();
...