2016-05-22 4 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

もし私が間違っていないなら、この関数はカウンターインデックスの日付フィールドの既存の日付を置き換え、実際には展開しません。また、カウンタが以前に定義された日付の長さを超えると、範囲外になります。むしろ配列の代わりにリストを使用したいと思います。次に、次のようなものがあります。 '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の値を簡単に取り出すことができます。

全体として、可能な限りメソッドの副作用を避けることは良い方法です。あなたのようにパラメータとして渡された配列を変更することは、後で噛んでしまう良い方法です。

また、Linq拡張メソッドはIEnumerable<T>に定義されているので、メソッドのパラメータをIEnumerable<Letter>に変更できます。 LinkedList<Letter>と全く同じ働きをしますが、後で別のコレクションタイプ(List<Letter>など)を使用することに決めた場合には壊れないという利点があります。

関連する問題