Tôi có phương pháp mở rộng sau:
public static IEnumerable<T> Apply<T>(
[NotNull] this IEnumerable<T> source,
[NotNull] Action<T> action)
where T : class
{
source.CheckArgumentNull("source");
action.CheckArgumentNull("action");
return source.ApplyIterator(action);
}
private static IEnumerable<T> ApplyIterator<T>(this IEnumerable<T> source, Action<T> action)
where T : class
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
Nó chỉ áp dụng một hành động cho từng mục của chuỗi trước khi trả lại.
Tôi đã tự hỏi liệu tôi có nên áp dụng Pure
thuộc tính (từ chú thích Resharper) cho phương thức này hay không và tôi có thể thấy các đối số cho và chống lại nó.
Ưu điểm:
- Nói đúng ra, nó là thuần khiết; chỉ gọi nó trên một chuỗi không làm thay đổi trình tự (nó trả về một chuỗi mới) hoặc thực hiện bất kỳ thay đổi trạng thái quan sát được
- Gọi nó mà không sử dụng kết quả rõ ràng là một sai lầm, vì nó không có tác dụng trừ khi trình tự được liệt kê, vì vậy tôi muốn Resharper cảnh báo tôi nếu tôi làm điều đó.
Nhược điểm:
- mặc dù
Apply
bản thân phương thức là thuần túy, việc liệt kê chuỗi kết quả sẽ tạo ra những thay đổi trạng thái có thể quan sát được (đó là điểm của phương thức). Chẳng hạn,items.Apply(i => i.Count++)
sẽ thay đổi giá trị của các mục mỗi lần liệt kê. Vì vậy, áp dụng thuộc tính Pure có lẽ là sai lệch ...
Bạn nghĩ sao? Có nên áp dụng thuộc tính hay không?