Вы можете предоставить свой собственный сопоставитель для сопоставления аргументов
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);
Вы могли легко добавить свой собственный дополнительный метод:
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"));
Если Вы просто используете пример в качестве способа изучить 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);
}
}
Кажется прекрасным мне. Вы могли бы сохранить пару символов путем изменения выбора на:
.Select((Value, Index) => new {Value, Index})
В Списке коллекций также есть метод FindIndex, для которого вы создаете метод удаления, который может возвращать индекс из коллекции. Вы можете обратиться к следующей ссылке в msdn http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx .
Как насчет этого? Он похож на исходный плакат, но сначала я выбираю индексы, а затем создаю коллекцию, соответствующую критериям.
var x = s.Select((a, i) => i).Where(i => s[i].StartsWith("t"));
Это немного менее эффективно, чем некоторые другие ответы, так как список полностью повторяется дважды.