Advertisement
NPSF3000

Typed Where

Nov 6th, 2013
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.39 KB | None | 0 0
  1. //http://stackoverflow.com/questions/19807573/why-a-lot-of-linq-methods-return-ienumerable-instead-of-a-more-specific-type/19809155#19809155
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5.  
  6. namespace TypedWhereExample
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             var data = Enumerable.Range(0, 1000);
  13.             var typedWhere1 = data.TypedWhere(x => x % 2 == 0);
  14.             var typedWhere2 = typedWhere1.TypedWhere(x => x % 3 == 0);
  15.             var result = typedWhere2.Take(10).ToList();  //Works like usual Linq
  16.  
  17.             //But returns additional data
  18.             Console.WriteLine("Result: " + string.Join(",", result));
  19.             Console.WriteLine("Typed Where 1 Skipped: " + typedWhere1.Skipped);
  20.             Console.WriteLine("Typed Where 1 Returned: " + typedWhere1.Returned);
  21.             Console.WriteLine("Typed Where 2 Skipped: " + typedWhere2.Skipped);
  22.             Console.WriteLine("Typed Where 2 Returned: " + typedWhere2.Returned);
  23.             Console.ReadLine();
  24.  
  25.             //Result: 0,6,12,18,24,30,36,42,48,54
  26.             //Typed Where 1 Skipped: 27
  27.             //Typed Where 1 Returned: 28
  28.             //Typed Where 2 Skipped: 18
  29.             //Typed Where 2 Returned: 10
  30.         }
  31.     }
  32.  
  33.     public static class MyLINQ
  34.     {
  35.         public static TypedWhereEnumerable<T> TypedWhere<T>
  36.             (this IEnumerable<T> source, Func<T, bool> filter)
  37.         {
  38.             return new TypedWhereEnumerable<T>(source, filter);
  39.         }
  40.     }
  41.  
  42.     public class TypedWhereEnumerable<T> : IEnumerable<T>
  43.     {
  44.         IEnumerable<T> source;
  45.         Func<T, bool> filter;
  46.  
  47.         public int Skipped { get; private set; }
  48.         public int Returned { get; private set; }
  49.  
  50.         public TypedWhereEnumerable(IEnumerable<T> source, Func<T, bool> filter)
  51.         {
  52.             this.source = source;
  53.             this.filter = filter;
  54.         }
  55.  
  56.         IEnumerator<T> IEnumerable<T>.GetEnumerator()
  57.         {
  58.             foreach (var o in source)
  59.                 if (filter(o)) { Returned++; yield return o; }
  60.                 else Skipped++;
  61.         }
  62.  
  63.         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  64.         {
  65.             foreach (var o in source)
  66.                 if (filter(o)) { Returned++; yield return o; }
  67.                 else Skipped++;
  68.         }
  69.     }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement