2016-05-22 85 views
0

此方法查找不同的日期並添加到日期數組中。是否有可能使用linq/lambda來創建這個方法?包含使用Linq/Lambda的方法

public static void FindDates(DateTime[] dates, LinkedList<Letter> L, out int counter) 
{ 
    counter = 0; 

    foreach (var let in L) 
    { 
     if (!dates.Contains(let.Date)) 
     { 
      dates[counter] = let.Date; 
      counter++; 
     } 
    } 
} 
+1

沒有你不能。因爲LinkedList不支持linq。但是你可以編寫你自己的擴展,這不是你想要的。因爲你已經在使用foreach循環。 –

+1

如果我沒有弄錯,這個函數會替換計數器索引中日期字段中的現有日期,而不是實際擴展它。如果計數器達到超過先前定義的日期長度,它也會超出範圍。我寧願使用List而不是數組。然後是這樣的: 'var newDates = L.Where(letterDate =>!dates.Contains(letterDate)); dates.AddRange(newDates);' 如果你需要計數器,它應該等於newDates.Count – HotTowelie

回答

2

您需要更改該方法的原型,但你可以這樣做:通過讀取結果列表的Count財產

public static IReadOnlyList<DateTime> FindDates(IEnumerable<Letter> L) 
{ 
    return L.Select(l => l.Date).Distinct().ToList(); 
} 

counter值可以很容易地檢索。

總的來說,儘可能避免方法中的副作用是一種很好的做法。像你一樣修改一個作爲參數傳遞的數組是一種很好的方法,可以在稍後被咬。

此外,由於在IEnumerable<T>上定義了Linq擴展方法,我們可以將該方法的參數更改爲IEnumerable<Letter>。它會和你的LinkedList<Letter>完全一樣,還有一個好處,就是如果你稍後決定使用另一個集合類型(例如List<Letter>