Đừng để danh sách được null
Đảm bảo các đối tượng luôn luôn ở trong trạng thái hợp lệ. Bằng cách đảm bảo danh sách không bao giờ là rỗng, bạn không bao giờ phải kiểm tra xem danh sách có rỗng không.
public class MyClass
{
private readonly IEnumerable<int> ints;
public MyClass(IEnumerable<int> ints)
{
this.ints = ints;
}
public IEnumerable<int> IntsGreaterThan5()
{
return this.ints.Where(x => x > 5);
}
}
Ngay cả khi danh sách này trống, bạn vẫn nhận được IEnumerable<int>
hợp lệ trở lại.
Max và Min quá tải với các loại Nullable
Điều đó vẫn không giải quyết được "Max" và "Min" vấn đề mặc dù. Có quá tải Max và Min có bộ chọn. Những quá tải selector có thể trở lại ints nullable, vì vậy phương pháp tối đa của bạn trở nên này:
this.ints.Max(x => new int?(x));
Do đó, bạn chạy Max và kiểm tra xem bạn đã nhận được một giá trị null hay một số nguyên trở lại. thì đấy!
Lựa chọn khác
Phương pháp chỉnh mở rộng
Bạn cũng có thể viết phương pháp khuyến nông của riêng bạn.
public static MinMaxHelper()
{
public static int? MaxOrDefault(IEnumerable<int> ints)
{
if(!ints.Any())
{
return null;
}
return ints.Max();
}
public static int MaxOrDefault(IEnumerable<int> ints, int defaultValue)
{
if(!ints.Any())
{
return defaultValue;
}
return ints.Max();
}
}
Trọng LINQ Extension Methods
Và cuối cùng, hãy nhớ rằng việc xây dựng trong phương pháp khuyến nông LINQ có thể được overriden với các phương pháp mở rộng của riêng bạn với chữ ký phù hợp. Vì vậy, bạn có thể viết một phương thức mở rộng để thay thế .Where (...) và .Max (...) để trả về null (hoặc một giá trị mặc định) thay vì ném một ArgumentNullException nếu Enumerable là null.
Nguồn
2011-11-09 16:52:35
IMHO, các đối tượng như danh sách không bao giờ nên rỗng. Tôi luôn khởi tạo chúng nếu chúng là một thành viên lớp, và nếu chúng được trả về từ một hàm tạo của riêng tôi, tôi đảm bảo rằng hàm trả về một danh sách rỗng hơn là null. –
Có thể trùng lặp câu trả lời tại: http://stackoverflow.com/questions/41319/checking-if-a-list-is-empty-with-linq – VS1
Bạn luôn có thể viết các phương pháp mở rộng của riêng mình để sử dụng các hành động như Trong đó() hoặc Max() sẽ bao gồm phép thử null và Count của bạn trước khi sử dụng phương thức mở rộng thực tế. – Paul