Cách tiếp cận này:
1) Nhóm theo ngày
2) Đối với mỗi ngày, nhóm của Phạm vi và tính toán Tổng
3) Đối với mỗi ngày, chọn mục với vĩ đại nhất Tổng
4) Bạn kết thúc với kết quả của bạn
public sealed class Program
{
public static void Main(string[] args)
{
var items = new[]
{
new { ID = 1, Date = new DateTime(10, 10, 10), Range = "9-10" },
new { ID = 2, Date = new DateTime(10, 10, 10), Range = "9-10" },
new { ID = 3, Date = new DateTime(10, 10, 10), Range = "9-10" },
new { ID = 4, Date = new DateTime(10, 10, 10), Range = "8-9" },
new { ID = 5, Date = new DateTime(10, 10, 11), Range = "1-2" },
new { ID = 6, Date = new DateTime(10, 10, 11), Range = "1-2" },
new { ID = 7, Date = new DateTime(10, 10, 12), Range = "5-6" },
};
var itemsWithTotals = items
.GroupBy(item => item.Date) // Group by Date.
.Select(groupByDate => groupByDate
.GroupBy(item => item.Range) // Group by Range.
.Select(groupByRange => new
{
Date = groupByDate.Key,
Range = groupByRange.Key,
Total = groupByRange.Count()
}) // Got the totals for each grouping.
.MaxElement(item => item.Total)); // For each Date, grab the item (grouped by Range) with the greatest Total.
foreach (var item in itemsWithTotals)
Console.WriteLine("{0} {1} {2}", item.Date.ToShortDateString(), item.Range, item.Total);
Console.Read();
}
}
/// <summary>
/// From the book LINQ in Action, Listing 5.35.
/// </summary>
static class ExtensionMethods
{
public static TElement MaxElement<TElement, TData>(this IEnumerable<TElement> source, Func<TElement, TData> selector) where TData : IComparable<TData>
{
if (source == null)
throw new ArgumentNullException("source");
if (selector == null)
throw new ArgumentNullException("selector");
bool firstElement = true;
TElement result = default(TElement);
TData maxValue = default(TData);
foreach (TElement element in source)
{
var candidate = selector(element);
if (firstElement || (candidate.CompareTo(maxValue) > 0))
{
firstElement = false;
maxValue = candidate;
result = element;
}
}
return result;
}
}
Theo LINQ trong hành động (Chương 5.3.3 - LINQ sẽ đối tượng bị tổn thương hiệu suất của mã của tôi?), Sử dụng phương pháp mở rộng MaxElement là một trong những phương pháp hiệu quả nhất. Tôi nghĩ hiệu suất sẽ là O (4n); một cho GroupBy đầu tiên, hai cho GroupBy thứ hai, ba cho Count() và bốn cho vòng lặp trong MaxElement.
Cách tiếp cận của DrDro sẽ giống O (n^2) vì nó lặp lại toàn bộ danh sách cho từng mục trong danh sách.
Stripling Cách tiếp cận của Warrior sẽ tiến gần hơn đến O (n log n) vì nó sắp xếp các mục. Mặc dù tôi sẽ thừa nhận, có thể có một số ma thuật điên rồ ở đó mà tôi không hiểu.
Bạn có thể giải thích điều này có nghĩa là phải làm gì không? Vì Max trả về một giá trị duy nhất, tôi không chắc nó có thể giúp ích gì cho câu hỏi này. – Jla