SingleOrDefault trả về null, nhưng nếu tôi muốn gán giá trị đại diện cho đối tượng không được tìm thấy thì sao?SingleOrDefault: Làm thế nào để thay đổi các giá trị mặc định?
Trả lời
Bạn có thể tự cuộn.
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if (1 != enumerable.Count()) {
return defaultValue;
}
return enumerable.Single();
}
Điều này có thể tốn kém một chút do Count() yêu cầu bạn xử lý toàn bộ bộ sưu tập và có thể tốn kém để chạy. Sẽ tốt hơn cho một trong hai gọi Độc thân, bắt InvalidOperationException hoặc cuộn một phương pháp IsSingle
public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
using (var e = enumerable.GetEnumerator()) {
return e.MoveNext() && !e.MoveNext();
}
}
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if (!enumerable.IsSingle()) {
if(enumerable.IsEmpty()) {
return defaultValue;
}
throw new InvalidOperationException("More than one element");
}
return enumerable.Single();
}
Điều này sẽ trả về giá trị mặc định nếu có thể đếm được nhiều đối tượng. Không nên nó ném một ngoại lệ như việc thực hiện tiêu chuẩn không? – tvanfosson
@tvanfosson đúng vậy. Tôi đã có ấn tượng rằng SingleOrDefault sẽ trả về giá trị mặc định nếu có bất kỳ điều gì khác ngoài một phần tử. Nhưng rõ ràng nó sẽ chỉ làm như vậy cho không có yếu tố. Lạ thật, tôi sẽ cập nhật. – JaredPar
Bạn có thể tạo ra phương pháp khuyến nông của riêng bạn - SingleOrNew.
public static class IEnumerableExtensions
{
public static T SingleOrNew<T>(this IEnumerable<T> enumeration, T newValue)
{
T elem = enumeration.SingleOrDefault();
if (elem == null)
{
return newValue;
}
return elem;
}
public static T SingleOrNew<T>(this IEnumerable<T> enumeration, Func<T,bool> predicate, T newValue)
{
T elem = enumeration.SingleOrDefault(predicate);
if (elem == null)
{
return newValue;
}
return elem;
}
}
Vấn đề với phương pháp này là bạn sẽ trả về tham số newValue cho một tập hợp chứa một phần tử có giá trị null. Xem xét biểu thức này (chuỗi mới [] {null}). SingleOrNew ("foo") ;. Nó sẽ trả lại không chính xác "foo" – JaredPar
@JaredPar - tôi sẵn sàng sống với điều đó. Nói chung, tôi không đặt null trong bộ sưu tập của tôi và tôi đã tìm thấy một khi sử dụng một phương pháp như thế này, tôi có lẽ muốn thay thế nó với giá trị mặc định của tôi anyway. – tvanfosson
@tvanfosson, đó là một thay đổi đột phá đáng kể từ thuật toán ban đầu mà làm cho một giả định khổng lồ về cách mọi người sử dụng null. – JaredPar
?? operator. Nếu đối số bên trái là null, đánh giá và trả về đối số thứ hai.
myCollection.SingleOrDefault() ?? new[]{new Item(...)}
Điều này sẽ chỉ hoạt động với các loại tham chiếu (hoặc null), nhưng nó sẽ làm những gì bạn đang tìm kiếm rất đơn giản.
Một tràng pháo tay nhỏ xuất hiện trong đầu tôi khi tôi sử dụng sự kết hợp rỗng. +1 – Stimul8d
@ Joe Tôi nghĩ rằng OP thực sự muốn thay đổi giá trị mặc định được trả về trực tiếp từ SingleOrDefault(), ví dụ: nếu tìm kiếm đối tượng Person và không tồn tại đối tượng nào thì có thể anh ta muốn SingleOrDefault() trả về một đối tượng NullPerson. Sự hiểu biết của tôi là không thể thay đổi kiểu trả về và vấn đề phải được giải quyết theo cách bạn đã làm, nhưng một lần nữa tôi nghĩ điều quan trọng là phải làm rõ cho OP rằng giá trị trả về mặc định của SingleOrDefault() không thể đã thay đổi. – Matt
- 1. thay đổi mặc định Giá trị Boolean
- 2. Giá trị mặc định của cột thay đổi
- 3. Làm cách nào để thay đổi giá trị mặc định của cột trong PostgreSQL?
- 4. Làm cách nào để thay đổi giá trị mặc định của bảng mysql?
- 5. Làm thế nào để nhận được giá trị từ đối tượng, với giá trị mặc định
- 6. làm thế nào để thay đổi nút XML giá trị
- 7. C# Làm thế nào để đặt giá trị mặc định cho các thuộc tính tự động?
- 8. Làm thế nào để tránh các giá trị mặc định tuần tự hóa?
- 9. Làm thế nào để chèn các giá trị mặc định trong bảng SQL?
- 10. Làm cách nào để đặt giá trị mặc định cho danh sách các mục?
- 11. Bootstrap typeahead - Làm thế nào để thiết lập giá trị mặc định bằng tay
- 12. làm thế nào để thiết lập giá trị mặc định thời gian chờ savon
- 13. Làm cách nào để thay đổi giá trị Hash?
- 14. Sửa đổi giá trị mặc định trong SQL Server
- 15. đối số dòng lệnh bash thay thế giá trị mặc định cho các biến
- 16. RingtonePreference Giá trị mặc định
- 17. Làm cách nào để hiển thị giá trị mặc định dưới dạng trống thay vì giá trị mặc định của loại?
- 18. Làm thế nào để thay đổi nls_date_format mặc định cho oracle client jdbc
- 19. giá trị chung Mặc định
- 20. Làm cách nào để đặt giá trị mặc định cho các nút radio trong AngularJS?
- 21. Thay đổi mặc định của một Plugin
- 22. GlassFish 3: làm thế nào để bạn thay đổi định dạng ghi (mặc định)?
- 23. làm thế nào để thiết lập chọn giá trị mặc định hộp trong php
- 24. Làm thế nào để thay đổi định dạng mẫu Django ngày mặc định?
- 25. Làm thế nào để thay đổi định dạng mặc định trong StringToDate? Spring WebFlow
- 26. DropdownListFor giá trị mặc định
- 27. DependencyProperty Giá trị mặc định
- 28. cách đặt giá trị mặc định HTML.EditorFor()
- 29. Làm thế nào để thay thế giá trị trường sql
- 30. JasperReports: giá trị mặc định thay vì 'null'
bạn có tìm thấy câu trả lời nào không? bạn không thể thay đổi mặc định là lời hứa theo phương thức. vì SingleOrDefault phải là SingleOrNull nhưng nó có thể trả về đối tượng giá trị. ai có thể trả về 0 cho int, đó là số mặc định hoặc số được cho là? SingleOrDefault có thể trả về 0 nhưng không được mặc định. trả về null hay không. đó là mô hình xấu cho OOP. –