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