using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApplication18
{
class Program
{
static void Main(string[] args)
{
var arr = new byte[100000000];
var sw = Stopwatch.StartNew();
try
{
Console.WriteLine(arr.Single(i => i == 0));
}
catch (Exception)
{
sw.Stop();
}
finally
{
Console.WriteLine(sw.Elapsed);
}
var sw2 = Stopwatch.StartNew();
try
{
Console.WriteLine(arr.MySingle(i => i == 0));
}
catch (Exception)
{
sw2.Stop();
}
finally
{
Console.WriteLine(sw2.Elapsed);
}
Console.WriteLine("Difference = {0}", (double) sw.ElapsedTicks/sw2.ElapsedTicks);
}
}
public static class LinqTester
{
public static TSource MySingle<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
throw new ArgumentNullException("source");
if (predicate == null)
throw new ArgumentNullException("predicate");
TSource result = default(TSource);
int count = 0;
foreach (TSource value in source)
{
if (predicate(value))
{
checked { ++count; }
if (count > 1)
throw new Exception("MoreThanOneMatch");
result = value;
}
}
if (count == 0)
throw new Exception("NoMatch");
return result;
}
public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
throw new ArgumentNullException("source");
if (predicate == null)
throw new ArgumentNullException("predicate");
TSource source1 = default(TSource);
long num = 0L;
foreach (TSource source2 in source)
{
if (predicate(source2))
{
source1 = source2;
checked { ++num; }
}
}
switch (num)
{
case 0L:
throw new Exception("NoMatch");
case 1L:
return source1;
default:
throw new Exception("MoreThanOneMatch");
}
}
}
}