数値の配列があり、その中で連続する昇順の数値の最初のシリーズ (カウントが 2 つ以上) を見つけたいと考えています。
入力例:{5, 1, 2, 4, 8, 7, 6, 9}
望ましい出力: {1, 2, 4, 8}
これは、指定された開始インデックスから最初の昇順シーケンスを見つける必要があります。
public static IEnumerable<int> GetAscending(IEnumerable<int> input, int startIndex)
{
var ascending = input.Skip(startIndex)
.Zip(input.Skip(startIndex + 1), (first, second) => new { Num = first, Next = second, Diff = second - first })
.SkipWhile(p => p.Diff <= 0)
.TakeWhile(p => p.Diff > 0)
.Select(p => Tuple.Create(p.Num, p.Next))
.ToArray();
if(ascending.Length == 0) return Enumerable.Empty<int>();
return ascending.Select(t => t.Item1).Concat(new int[] { ascending.Last().Item2 });
}
public IEnumerable<int> getAscendingValues(IEnumerable<int> source)
{
List<int> output = new List<int>();
foreach (int next in source)
{
if (output.Count == 0 || output.Last() < next)
{
output.Add(next);
}
else
{
if (output.Count <= 1)
{
output.Clear();
}
else
{
return output;
}
}
}
if (output.Count > 1)
{
return output;
}
else
{
return null; //could also return an empty enumeration
}
}
特定のインデックスで開始したい場合は、Skip
それをサポートするために追加のパラメーターを追加するのではなく、これを呼び出す前にメソッドを使用できます。(つまりgetAscendingValues(values.Skip(startIndex))
)