2013-04-18 6 views
5

私は2つのlinq文を持っています - 現在スイッチブロックの真ん中にあります。ステートメントは以下の通りです。これらの2つのlinq文から1つの汎用メソッドを作ることはできますか?

pwStartTime = lender.ApplicationWindows 
.Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay) 
.Select(w => w.StartTime) 
.FirstOrDefault(); 


pwStartTime = lender.TransferWindows 
.Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay) 
.Select(w => w.StartTime) 
.FirstOrDefault(); 

あなたが唯一の違いは、彼らがしかし、LINQクエリで使用されるすべての要素は、「ApplicationWindows」と「TransferWindows」で同一であり、彼らは「貸し手」の2つの異なる特性を参照していることである見ることができるように同じオブジェクトではなく、それぞれに他の固有のプロパティが含まれています。

したがって、w.StartDateを1つの汎用メソッドで返すことは可能ですか?

ありがとうございます。

//ここでは2クラス

public class ApplicationWindow 
{ 
    public string Name { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
} 

public class TransferWindow 
{ 
    public string Name { get; set; } 

    public DateTime StartTime { get; set; } 

    public DateTime EndTime { get; set; } 

    [XmlIgnore] 
    public TimeSpan Cycle { get; set; } 

    [Browsable(false)] 
    [XmlElement("Cycle")] 
    public string CycleString 
    { 
     get { return XmlConvert.ToString(Cycle); } 
     set { Cycle = value.IsNullOrEmpty() ? TimeSpan.Zero : XmlConvert.ToTimeSpan(value); } 
    } 
} 
+0

'lender.ApplicationWindows'と' lender.TransferWindows'の種類は何ですか? –

+0

ApplicationWindowsとTransferWindowsは、LINQ内で使用しているフィールドを含む共通のインターフェイスを実装していますか? – Satal

+0

@AntP - 私は2つのクラスを追加しました – dotnetnoob

答えて

1

はなぜ共通プロパティを定義し、TransferWindowApplicationWindowためのインターフェイスまたは抽象基本クラスを作成しないのですか?そして、あなたは(lender.TransferWindowslender.ApplicationWindowsがそれぞれのクラスのリストであると仮定して - いない場合は、必要に応じてメソッドのシグネチャを変更する)このような何かを行うことができます。

public DateTime GetStartTime(IList<Window> windows, DateTime dateToCheck, string pwPeriod) 
{ 
    return windows 
    .Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay) 
    .Select(w => w.StartTime) 
    .FirstOrDefault(); 
} 
5

ApplicationWindowsとTransferWindowsは共通のインタフェースを実装するなら、あなたは行うことができます以下;

public DateTime GetStartTime(IEnumerable<IWindow> windows, string pwPeriod, TimeSpan timeOfDay) 
{ 
    return windows.Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > timeOfDay) 
     .Select(w => w.StartTime) 
     .FirstOrDefault(); 
} 

UPDATEあなたはこれらの2つのウィンドウクラスと同じ名前の部分クラスを作成することにより、(と同じ名前空間に)インタフェースを実装することができ、その後LINQ to SQLのを使用している場合

これがインターフェイスを実装していると言っています。

私はこれをしばらくしていないが、これはうまくいくと思います。私はVB.NETでそれを行いました。

+0

それにビートします;)また、あなたの 'dateToCheck'変数は存在しません。 –

+0

私が何とかそれを二度投稿したのかどうか疑問に思ったとき、私はちょうど同じコードを見たとき、ちょっと混乱しました。私は間違った部分を編集しました。ありがとうございました:) – Satal

+0

Lol、助けてくれてありがとう - 完了し、働いています - 申し訳ありませんが、1人の勝者しかいません。 – dotnetnoob

3

あなたがインターフェイスに何ができるかの例:あなたは一つのインタフェースを目指す方法を持っている場合

pwStartTime = lender.ApplicationWindows.FirstOrDefaultDateTime(pwPeriod, dateToCheck); 
pwStartTime = lender.TransferWindows.FirstOrDefaultDateTime(pwPeriod, dateToCheck); 

public interface IWindow 
{ 
    string Name { get; } 
    public DateTime StartTime { get; } 
    public DateTime EndTime { get; } 
} 

public class ApplicationWindow : IWindow 
{ 
    public string Name { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
} 

public class TransferWindow : IWindow 
{ 
    public string Name { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
} 

public static class IWindowExt 
{ 
    public static DateTime FirstOrDefaultDateTime(this IEnumerable<IWindow> windows, string pwPeriod, DateTime dateToCheck) 
    { 
     return windows 
       .Where(w => w.Name == pwPeriod && w.EndTime.TimeOfDay > dateToCheck.TimeOfDay) 
       .Select(w => w.StartTime) 
       .FirstOrDefault(); 
    } 
} 

は、きれいに解決策は、関連する拡張メソッドを作成することです。

+0

拡張メソッドを使用する場合は+1してください。 –

関連する問題