아래의 문장을 사용하여 모든 컴퓨터 개체를MachineList
컬렉션 (IEnumerable 형식)MachineStatus
의나는. 그만큼MachineList
컬렉션에는 항상 상태가있는 컴퓨터가 포함되지는 않습니다.나는.
기계가 없을 때MachineStatus
의나는빈 콜렉션을 반환하고 싶습니다. 내 전화 :ActiveMachines
(처음 사용되는) 작동하지만InactiveMachines
하지 않습니다.
public IEnumerable<Machine> ActiveMachines
{
get
{
return Customer.MachineList
.Where(m => m.MachineStatus == "a");
}
}
public IEnumerable<Machine> InactiveMachines
{
get
{
return Customer.MachineList
.Where(m => m.MachineStatus == "i");
}
}
편집하다
추가 검토를 통해MachineList
다음의 열거 형을MachineList
exeception을 던지기 :Object reference not set to an instance of an object
.
따라서 통화가 이루어지면 문제가되지 않습니다.ActiveMachines
또는InactiveMachines
그것의 문제로MachineList
수집. 내가 전화를 끊을 수 있기 때문에 이것은 특히 문제가됩니다.MachineList
단순히 코드에서 호출되기 전에 Watch에서이를 열거하면됩니다. 최저 수준MachineList
도구NHibernate.IQuery
반환되는IEnumerable
. 원인MachineList
초기 열거 후에 내용을 잃어 버리는가?
Where
일치하는 것이없는 경우 빈 시퀀스를 반환합니다. 이것은 완벽하게 유효한 시퀀스입니다 (null이 아님). 네가 null을 얻는 유일한 방법은 전화하면된다.FirstOrDefault
또는SingleOrDefault
.
벌레가 당신이 생각하는 곳에 있다고 확신합니까?
int?[] nums = { 1, 3, 5 };
var qry = nums.Where(i => i % 2 == 0);
Console.WriteLine(qry == null); // false
Console.WriteLine(qry.Count()); // 0
var list = qry.ToList();
Console.WriteLine(list.Count); // 0
var first = qry.FirstOrDefault();
Console.WriteLine(first == null); // true
기본적으로,열거 형. 어디에서이미 빈을 반환합니다.IEnumerable<T>
, not null. "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."가 표시되는 경우 예외가 발생하면 다른 문제가있을 수 있습니다.
아마도 MachineList가 null일까요? 당신이 그것을 만들지 않았다면, 당신은 당신의 전화에 그 예외를 받게 될 것입니다..Where(...)
또한 명시 적으로 빈 컬렉션을 반환하려는 경우이 방법이 도움이 될 수 있습니다.
Enumerable.Empty<Machine>();
MachineStatus
예외를 던지고있는 facade 속성입니다.public string MachineStatus { get {return someInnerField.Status;}}
과someInnerField
~이다.null
. - Marc Gravell♦IEnumerable
여러 번. 귀하가 귀하의 제품을 섭취 할 때 귀하가 동의하는 암묵적 계약IEnumerable
한 번만 열거하는 것입니다! 따라서 직장 동료가 코드를 변경하여 여러 개의 열거 형을 허용 할 수있는 것은 아니지만 사용자가 할 수 있어야합니다.Customer.MachineList.ToList()
어떤 시점에서 그 다음 결과 목록 만 사용하십시오 (또는 새로운IEnumerable
다시). 게으른 평가를 할 수 있습니다. 캐시 할 수는 있지만 두 번 열거하지 마십시오. 또한IQueryable
그것을 여러 번 부른다. - ErikE