2013-04-18 17 views
5

Şu anda bir anahtar bloğunun ortasında 2 linq ifadem var. İfadeler aşağıda.Bu 2 linq ifadesinden 1 genel yöntem yapmak mümkün mü?

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(); 

Eğer tek fark ancak, "borç veren" iki farklı özelliklere atıfta olmasıdır görebileceğiniz gibi, linq sorguda kullanılan tüm elemanlar rağmen, "ApplicationWindows" ve "TransferWindows" aynıdır onlar aynı nesneler değildir ve her biri diğer benzersiz özellikleri içerir.

Yani, bir genel yöntemle w.StartDate döndürmek mümkün mü?

Şimdiden teşekkürler.

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' ve' lender.TransferWindows' türleri nelerdir? –

+0

ApplicationWindows ve TransferWindows, LINQ içinde kullanmakta olduğunuz alanları içeren ortak bir arabirim uygular mı? – Satal

+0

@AntP - 2 sınıfını ekledim – dotnetnoob

cevap

1

Neden ortak özelliklerini tanımlayan TransferWindow ve ApplicationWindow için bir arayüz veya soyut temel sınıf oluşturmaz 2 sınıflar İşte //? ApplicationWindows ve TransferWindows ortak bir arabirim ise

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

o zaman yapabilirsiniz: - (eğer uygunsa yöntem imzası değiştirmek lender.TransferWindows ve lender.ApplicationWindows kendi sınıflarının listeleri olduğunu varsayarsak) Sonra böyle bir şey yapabilirsiniz takip etme;

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(); 
} 

GÜNCELLEME Eğer bu iki Pencere sınıfları aynı ada sahip kısmi bir sınıf oluşturarak (ve aynı ad alanında) bir arabirim uygulamak olabilir sonra LINQ to SQL kullanıyorsanız

Bunun arayüzün uygulandığını söyleyerek.

Bunu yapmam gerektiğine inanıyorum, bunu bir süredir yapmadım ve VB.NET ile yaptım.

+0

Bunu size yendi;) - Ayrıca, dateToCheck değişkeniniz mevcut değil. –

+0

Haha yaptın, sanki bir şekilde iki kez yayınlamayı başarabileceğimi merak ederek (neredeyse) tam olarak aynı kodu gördüğümde gerçekten kafam karıştı. Büyük akıllar ve tüm bu: P - Teşekkürler yanlış parçası düzenledi, bunun için teşekkürler :) – Satal

+0

Lol, yardım çocuklar için teşekkürler - teşekkürler ve çalışıyoruz - üzgünüm sadece 1 kazanan olabilir. Uzatma yöntemlerinin kullanımı için – dotnetnoob

3

Eğer arayüzleri ile neler yapabileceğini bir örnek: Eğer bir arayüz nişan yöntemi varsa

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(); 
    } 
} 

, güzel çözüm uzatma yöntemi ilişkili yaratmaktır.

+0

+1 - daha da sıkı! –

İlgili konular