Получение набора индексных значений с помощью запроса LINQ

Вы можете предоставить свой собственный сопоставитель для сопоставления аргументов

when(myMock.isContractAvailable(eq("0815"), argThat(new ArgumentMatcher<List<String>>() {
        @Override
        public boolean matches(List<String> list) {
            return "00123".equals(list.get(1)); // essentially ```list -> "00123".equals(list.get(1))``` in java 8
        }
})).thenReturn(true);
16
задан abatishchev 20 March 2013 в 08:05
поделиться

5 ответов

Вы могли легко добавить свой собственный дополнительный метод:

public static IEnumerable<int> IndexesWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    int index=0;
    foreach (T element in source)
    {
        if (predicate(element))
        {
            yield return index;
        }
        index++;
    }
}

Затем используйте его с:

string[] s = {"zero", "one", "two", "three", "four", "five"};
var x = s.IndexesWhere(t => t.StartsWith("t"));
29
ответ дан 30 November 2019 в 16:10
поделиться

Если Вы просто используете пример в качестве способа изучить LINQ, проигнорируйте это сообщение.


Мне не ясно, что LINQ является на самом деле лучшим способом сделать это. Код ниже кажется, что это было бы более эффективно, так как никакой новый анонимный тип не должен быть создан. Предоставленный, Ваш пример может быть изобретен, и техника могла бы быть более полезной в другом контексте, например, в структуре данных, где это могло использовать в своих интересах индекс на значении, но код ниже довольно прост, понятен (никакая требуемая мысль) и возможно более эффективен.

string[] s = {"zero", "one", "two", "three", "four", "five"};
List<int> matchingIndices = new List<int>();

for (int i = 0; i < s.Length; ++i) 
{
   if (s[i].StartWith("t"))
   {
      matchingIndices.Add(i);
   }
}
6
ответ дан 30 November 2019 в 16:10
поделиться

Кажется прекрасным мне. Вы могли бы сохранить пару символов путем изменения выбора на:

.Select((Value, Index) => new {Value, Index})
5
ответ дан 30 November 2019 в 16:10
поделиться

В Списке коллекций также есть метод FindIndex, для которого вы создаете метод удаления, который может возвращать индекс из коллекции. Вы можете обратиться к следующей ссылке в msdn http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx .

2
ответ дан 30 November 2019 в 16:10
поделиться

Как насчет этого? Он похож на исходный плакат, но сначала я выбираю индексы, а затем создаю коллекцию, соответствующую критериям.

var x = s.Select((a, i) => i).Where(i => s[i].StartsWith("t"));

Это немного менее эффективно, чем некоторые другие ответы, так как список полностью повторяется дважды.

1
ответ дан 30 November 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: