2014-02-17 20 views
8
public static class LinqExtensions 
    { 
     public static double Variance(this IList<double> data) 
     { 
      double sumSquares=0; 
      double avg = data.Average(); 
      foreach (var num in data) 
      { 
       sumSquares += (num - avg * num - avg); 
      } 
      return sumSquares/(data.Count - 1); 
     } 
     public static decimal? Variance<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector) 
     { 
      //where to start for implementing? 
     } 
    } 

Ich möchte einige LINQ-Erweiterungen für generische Typen vornehmen. Ich weiß, wie ich LINQ erweitern kann, ohne Delegaten zu verwenden, ich habe mehrere noch nicht definierte Typen, die Eigenschaften haben, die ich aufzählen muss und Dinge wie die Varianz. Wie kann ich meine Varianz-Erweiterungsmethode definieren, so dass ein Delegat benötigt wird?Generische Erweiterungsmethoden in LINQ

Antwort

8

Sie können wie folgt tun:

public static double? Variance<TSource>(this IEnumerable<TSource> source, 
     Func<TSource, double> selector) 
{ 
    double sumSquares=0; 
    double avg = source.Average(selector); 
    foreach (var item in source) 
    { 
     var num = selector(item); 
     sumSquares += (num - avg * num - avg); 
    } 
    return sumSquares/(source.Count() - 1); 
} 

Hier arbeitet Geige mit dieser Probe - http://dotnetfiddle.net/emPZC8

UPDATE

Probe Nutzungsart:

public class Item 
{ 
    public double Val {get;set;} 
} 

public class Program 
{ 
    public void Main() 
    { 
     var items = new List<Item>(); 
     items.Add(new Item(){Val=1.1}); 
     items.Add(new Item(){Val=2.1}); 
     items.Add(new Item(){Val=3.1}); 

     var variance = items.Variance<Item>((i) => i.Val); 
     Console.WriteLine(variance); 
    } 
} 
+0

+1. Erwägen Sie, die Beispielnutzung im Beitrag hinzuzufügen. –

+0

@Sergey Perfekt. Danke + 1 – wootscootinboogie

+0

Fiddle on DotNetFiddle hat ein Anwendungsbeispiel, aber ich habe es auch in die Antwort kopiert. –

Verwandte Themen