【问题标题】:How can I check for the length of an enumerable?如何检查可枚举的长度?
【发布时间】:2014-03-28 20:46:33
【问题描述】:

我有以下代码:

       var questionStatuses =
           (
               from questionStatus in this._questionStatusService.GetQuestionStatuses()
               select new
               {
                   id = questionStatus.QuestionStatusId,
                   status = questionStatus.Status
               }
           );
        if (questionStatuses == null || questionStatuses.length() == 0)
        {
            return Request.CreateResponse(HttpStatusCode.NotFound);
        }
        else
        {
            var response = Request.CreateResponse(HttpStatusCode.OK, questionStatuses);
            return response;
        }

questionStatuses 是一个 IEnumrable。

我如何检查以确保它的内容不仅仅是一个空数组?我试过 .length() 但它给出了一个错误。这也是 WebAPI 控制器的一部分,因此可以返回 IEnumerable 还是应该将其放入列表中,如果可以,我该怎么做?

【问题讨论】:

  • 你搜索过 IEnumerable 吗?

标签: c# asp.net


【解决方案1】:

questionStatuses 是一个 IEnumrable。如何检查以确保其内容不仅仅是一个空数组?

只需使用Any

questionStatuses.Any()

【讨论】:

  • 如果我使用 .Any() 是否还可以通过交换检查方式来替换检查是否为空的需要?
【解决方案2】:

使用.Count() 方法代替.length()

代码

  if (questionStatuses == null || questionStatuses.Count() == 0)
    {
        return Request.CreateResponse(HttpStatusCode.NotFound);
    }
    else
    {
        var response = Request.CreateResponse(HttpStatusCode.OK, questionStatuses);
        return response;
    }

【讨论】:

    【解决方案3】:

    您可以使用来自System.Linq.Count() 来获取长度。但是,您通常不想这样做,因为它会强制实现整个可枚举。 (另请注意,并非所有可枚举项都支持多次枚举)

    如果您必须转换为列表,请查看.ToList() 扩展方法。

    如果给你一个,通常你应该返回IEnumerable

    另请参阅 SO 上已有的其他答案(例如 IEnumerable doesn't have a Count method)。我再次建议您首先考虑是否真的需要计数。

    最后看看其他答案,展示如何使用.Any()检查可枚举是否为空(例如Recommended way to check if a sequence is empty

    【讨论】:

      【解决方案4】:

      使用count()

      试试这个代码,而不是你的代码

      var questionStatuses =
                 (
                     from questionStatus in this._questionStatusService.GetQuestionStatuses()
                     select new
                     {
                         id = questionStatus.QuestionStatusId,
                         status = questionStatus.Status
                     }
                 );
      var response =(questionStatuses==null || questionStatuses.count() == 0) ? Request.CreateResponse(HttpStatusCode.NotFound):Request.CreateResponse(HttpStatusCode.OK, questionStatuses);
      return response ;
      

      更新

      试试这个

       var questionStatuses =
                     (
                         from questionStatus in this._questionStatusService.GetQuestionStatuses()
                         select new
                         {
                             id = questionStatus.QuestionStatusId,
                             status = questionStatus.Status
                         }
                     );
          var response = !questionStatuses.Any() ? Request.CreateResponse(HttpStatusCode.NotFound):Request.CreateResponse(HttpStatusCode.OK, questionStatuses);
          return response ;
      

      【讨论】:

      • 你认为我可以通过仅使用 .any() 来替换对 null 的检查吗?
      • 如果源序列包含任何元素,Any() 返回 true;否则为假。您只需输入!questionStatuses.Any() 而不是(questionStatuses==null || questionStatuses.count() == 0)
      【解决方案5】:

      使用计数

      questionStatuses.count()

      【讨论】:

        【解决方案6】:

        既然你只想知道可枚举项是否为空,你可以这样做:

        if (questionStatuses == null || !(questionStatuses.GetEnumerator().MoveNext())){
        

        这将不需要枚举完整的IEnumerable - 否则可能会很昂贵。

        【讨论】:

          猜你喜欢
          • 2016-09-28
          • 2015-02-12
          • 2012-02-16
          • 2013-03-20
          • 1970-01-01
          • 1970-01-01
          • 2013-03-12
          • 1970-01-01
          相关资源
          最近更新 更多