Bạn có thể sử dụng một quá tải đặc biệt của Select
cho phép bạn sử dụng chỉ mục của mục và phương thức GroupBy
để chia danh sách thành các nhóm. Mỗi nhóm sẽ có hai mục.Dưới đây là một phương pháp mở rộng nào đó:
public static class ExtensionMethods
{
public static IEnumerable<TResult> SelectTwo<TSource, TResult>(this IEnumerable<TSource> source,
Func<TSource, TSource, TResult> selector)
{
return source.Select((item, index) => new {item, index})
.GroupBy(x => x.index/2)
.Select(g => g.Select(i => i.item).ToArray())
.Select(x => selector(x[0], x[1]));
}
}
Và bạn có thể sử dụng nó như thế này:
var list = new[] {1, 2, 3, 4, 5, 6};
var result = list.SelectTwo((x, y) => x + y).ToList();
này sẽ quay trở lại {3,7,11}
Xin lưu ý rằng ở trên phương pháp nhóm các dữ liệu trong bộ nhớ trước khi bắt đầu mang lại kết quả. Nếu bạn có các tập dữ liệu lớn, bạn có thể muốn có một cách tiếp cận trực tuyến (số liệu năng suất như các dữ liệu từ các nguồn đã được liệt kê), đây là một ví dụ:
public static class ExtensionMethods
{
public static IEnumerable<TResult> SelectTwo<TSource, TResult>(this IEnumerable<TSource> source,
Func<TSource, TSource, TResult> selector)
{
bool first_item_got = false;
TSource first_item = default(TSource);
foreach (var item in source)
{
if (first_item_got)
{
yield return selector(first_item, item);
}
else
{
first_item = item;
}
first_item_got = !first_item_got;
}
}
}
Nguồn
2016-02-10 22:55:49
LINQ chỉ là các phương thức mở rộng trên IEnumerables. Bạn có thể dễ dàng thực hiện việc này nếu mục tiêu cuối cùng chỉ để có thể sử dụng nó theo cách LINQ-y –