using System.Collections;
using System.Collections.Generic;
public static class Program
static ValueTuple<T, T> TwoOrDefault<T>(this IEnumerable<T> items, Comparer<T> comparator = null)
var c = comparator ?? Comparer<T>.Default;
var start = new ValueTuple<T, T>(default, default);
return items.Aggregate(start, (seed, source) =>
seed.Item2 = c.Compare(source, seed.Item1) == 1
: c.Compare(source, seed.Item1) == -1 && c.Compare(source, seed.Item2) == 1
seed.Item1 = c.Compare(source, seed.Item1) == 1 ? source : seed.Item1;
static T SecondOrDefault<T>(this IEnumerable<T> items, Comparer<T> comparator = null) {
return items.TwoOrDefault<T>(comparator).Item2;
public static void Main()
int[] ints = {45, 100, 50, 100, 100, 55, 54, 58, 70, 100, 70, 69};
var second1 = ints.SecondOrDefault();
Console.WriteLine(second1);
string[] strs = {"abs", "acc", "art", "amm", "ast"};
var second2 = strs.SecondOrDefault();
Console.WriteLine(second2);