2016-06-22 9 views
0

ジェネリック型(List myGenericList)のオブジェクトリストがあります。ジェネリック型に "Date"(DateTime型)というプロパティがあります。C#ジェネリック型Get最小日

最小の日付を取得したいとします。 myGenericList.Min(r => r.Date);

は、ここで私が実装するものですが、以下のコードは、エラーを与える:

- 'List<T>' does not contain a definition for 'Min' and the best 
    extension method overload 'Queryable.Min<T, DateTime>(IQueryable<T>, 
    Expression<Func<T, DateTime>>)' requires a receiver of type 
    'IQueryable<T>' myGenericList 

コード:

internal DateTime GetMinimumDate() 
    { 
     Expression<Func<T, DateTime>> lambdaExpression = ConstructLambdaExpression(); 
     return myGenericList.Min(lambdaExpression); 
    } 

    private Expression<Func<T, DateTime>> ConstructLambdaExpression() 
    { 
     //construct lambda expression: r => r.Date 
     var parameterExpression = Expression.Parameter(typeof(T)); 
     var propertyOrFieldExpression = Expression.PropertyOrField(parameterExpression, "Date"); 
     return Expression.Lambda<Func<T, DateTime>>(propertyOrFieldExpression,parameterExpression); 

    } 

は、あなたが任意のアイデアを持っていますか? ありがとうございました!

よろしく、

レオナ

答えて

1

変更Expression<Func<T, DateTime>>List(実際IEnumerable)用Min機能がFuncなくExpressionを受け付ける

Func<T, DateTime>します。これはあなたが得ているエラーです。

ワーキングコード:

internal DateTime GetMinimumDate<T>(List<T> myGenericList) 
{ 
    Func<T, DateTime> lambdaExpression = ConstructLambdaExpression<T>(); 
    return myGenericList.Min(lambdaExpression); 
} 

static Func<T, DateTime> ConstructLambdaExpression<T>() 
{ 
    PropertyInfo dateProperty = typeof(T).GetProperties().FirstOrDefault(x => x.Name == "Date"); 
    return t => Convert.ToDateTime(dateProperty.GetValue(t)); 
} 
-1

これは賢明な解決策ではありません

internal DateTime GetMinimumDate<T>(IEnumerable<T> list) 
    { 
     return GetDate(list.OrderBy(GetDate).FirstOrDefault()); 
    } 

    private static DateTime GetDate<T>(T item) 
    { 
     return (DateTime)(((dynamic)item).Date); 
    } 

(そのプロパティが存在しない場合にクラッシュ)実行時に日付プロパティを取得dynamicを、使用してみてください。

internal DateTime GetMinimumDate<T>(IEnumerable<T> list, Func<T, DateTime> getDate) 
{ 
    return getDate(list.OrderBy(getDate).FirstOrDefault()); 
} 
+0

ナットを分解する際に、使用するハンマーかを選択するために、そのハード:通常の方法は、あなたのタイプから日付を抽出機能を提供することです。 – buffjape

関連する問題