Как искать в Protobuf повторные поля? - PullRequest
0 голосов
/ 27 июня 2018

Я впервые работаю с protobuf, и мне интересно, есть ли способ получить доступ к определенному элементу внутри Повторного поля.

Я создал метод, который будет перебирать все элементы, проверять поле элемента и возвращать его (я не могу вернуть указатель на него :().

public Appearance findItem(int itemID) {
  foreach (Appearance item in appearances.Object) {
    if (item.Id == itemID) {
      return item;
    }
  }
  return null;
}

Кажется, что нет метода find для использования некоторых лямбда-выражений.

Есть ли другой способ добиться этого? Было бы идеально, если бы у меня был указатель на элемент, а не его копия, поэтому, если я его изменил, я мог бы написать полностью повторяющееся поле напрямую.

1 Ответ

0 голосов
/ 27 июня 2018

Было бы идеально, если бы я мог иметь указатель на элемент, а не его копию, поэтому, если я его поменяю, я могу написать полностью повторяющееся поле напрямую.

Вы не можете этого сделать, но вместо этого вы можете вернуть index элемента. Учитывая, что в повторяющихся полях реализовано IEnumerable<T>, вы сможете использовать LINQ достаточно легко. Например:

// index is an "int?" with a value of null if no items matched the query
var index = repeatedField
    // You could use tuples here if you're using C# 7. That would be more efficient.
    .Select((value, index) => new { value, (int?) index })
    // This is whatever condition you want
    .Where(pair => pair.value.SomeField == "foo")
    .Select(pair => pair.index)
    .FirstOrDefault();
...