6

아래의 문장을 사용하여 모든 컴퓨터 개체를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다음의 열거 형을MachineListexeception을 던지기 :Object reference not set to an instance of an object.

따라서 통화가 이루어지면 문제가되지 않습니다.ActiveMachines또는InactiveMachines그것의 문제로MachineList수집. 내가 전화를 끊을 수 있기 때문에 이것은 특히 문제가됩니다.MachineList단순히 코드에서 호출되기 전에 Watch에서이를 열거하면됩니다. 최저 수준MachineList도구NHibernate.IQuery반환되는IEnumerable. 원인MachineList초기 열거 후에 내용을 잃어 버리는가?


  • 아니, 열거에서 특별한 일은 일어나지 않는다. "비활성"항목이 무엇인지 알면 흥미로울 것입니다. 등이 디버거에 있습니다. 나는 또한 (예를 들어)MachineStatus예외를 던지고있는 facade 속성입니다.public string MachineStatus { get {return someInnerField.Status;}}someInnerField~이다.null. - Marc Gravell
  • 진짜 문제는 당신이IEnumerable여러 번. 귀하가 귀하의 제품을 섭취 할 때 귀하가 동의하는 암묵적 계약IEnumerable한 번만 열거하는 것입니다! 따라서 직장 동료가 코드를 변경하여 여러 개의 열거 형을 허용 할 수있는 것은 아니지만 사용자가 할 수 있어야합니다.Customer.MachineList.ToList()어떤 시점에서 그 다음 결과 목록 만 사용하십시오 (또는 새로운IEnumerable다시). 게으른 평가를 할 수 있습니다. 캐시 할 수는 있지만 두 번 열거하지 마십시오. 또한IQueryable그것을 여러 번 부른다. - ErikE

3 답변


7

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


  • 그것은 내가 생각한 것입니다. 동일한 오류가 발생하는 수정 사항을 반영하도록 제 질문을 수정했습니다. - ahsteele
  • 내 질문에 추가 정보를 추가하여 진행 상황을 밝힐 수 있습니다. 즉, 나는 새로운 실을 열 필요가 있다고 생각할지도 모른다. - ahsteele
  • 오류는 MachineList가 작성되는 방식대로 수행해야했습니다. 다른 개발자가이 방법을 사용하고 있었지만 빌드 방법을 확인하지 못했습니다. 올바른 방향을 찾고있는 것을 확인해 주셔서 감사합니다. - ahsteele

4

기본적으로,열거 형. 어디에서이미 빈을 반환합니다.IEnumerable<T>, not null. "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."가 표시되는 경우 예외가 발생하면 다른 문제가있을 수 있습니다.

아마도 MachineList가 null일까요? 당신이 그것을 만들지 않았다면, 당신은 당신의 전화에 그 예외를 받게 될 것입니다..Where(...)


  • 올바른 방향을 찾고있는 것을 확인해 주셔서 감사합니다. - ahsteele

2

또한 명시 적으로 빈 컬렉션을 반환하려는 경우이 방법이 도움이 될 수 있습니다.

Enumerable.Empty<Machine>();

연결된 질문


관련된 질문

최근 질문