首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可能存在多个IEnumerable枚举。如何解决?我需要解决这个问题吗?

可能存在多个IEnumerable枚举。如何解决?我需要解决这个问题吗?
EN

Stack Overflow用户
提问于 2012-04-23 20:47:00
回答 8查看 7.7K关注 0票数 3

我有以下代码,它在标题中给出了警告。我很确定我以前做过这样的事情,但它没有给出任何警告。我想就这些帖子问两件事。1)这里什么会导致问题? 2)需要修复吗?

我问这个问题的原因是,这段代码运行得很好,因为我希望它如此清楚地表明,这条警告不会导致问题。我不能忍受在我的代码中有警告等,所以我想要一个解决方案,但我也想知道为什么会出现这个警告,以及它是否在任何方面都是有害的。

代码:

代码语言:javascript
运行
复制
 public class AttributeType
 {
      private string m_attributeNameField;

      public string AttributeName
      {
          get { return m_attributeNameField; }
          set { m_attributeNameField = value; }
      }
 }

 private StandardResponseType ValidateAttributes(string featureType, IEnumerable<AttributeType> attributeList, string userCategory)
 {
       StandardResponseType standardResponse = 
       new StandardResponseType(DateTime.Now.ToString(CultureInfo.InvariantCulture), "RWOL_UTILS.Get_Item_Attributes", "", "OK");

        if (attributeList.Any())
        {
            foreach (AttributeType attribute in attributeList)
            {
                if (attribute.AttributeName == null) continue;
                {
                    //do stuff
                }
            }
        }
        else
        {
            standardResponse.Message = "Error: No attributes passed in the list. ValidateAttributes().";
            standardResponse.ResponseCode = "FAIL";

            return standardResponse;
        }
}

编辑:方法中有更多代码,但与此问题无关。

更新:我必须添加下面的代码才能让它工作。为什么添加这个更有效?如果我必须计算和读取新的列表,那么对原始项目进行计数和读取有什么不同?该列表仅传递一次。如果列表是在方法中填充的,但不是,我可以理解这个问题。它只是传入了已填充的内容。

代码语言:javascript
运行
复制
List<AttributeType> newlist = attributeList.ToList();

if (newlist.Count() != 0)
{
    foreach (AttributeType attribute in newlist)
............
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-04-23 20:50:51

可能的问题取决于您的IEnumerable来自何处。一些数据源可能只允许单个枚举,或者它们可能很昂贵(可能是一些数据库查询),这可能已经由attributeList.Any()启动。

您可以删除Any()检查,因为如果您的IEnumerable中没有元素,那么您的循环无论如何都不会运行(假设您的示例显示了完整的情况,并且没有其他依赖于该检查的逻辑)。

编辑:根据您编辑的问题,您不能删除复选标记。但是,您可以使用attributeList.ToArray()IEnumerable转换为数组,然后使用该数组并消除警告。

票数 3
EN

Stack Overflow用户

发布于 2012-04-23 20:49:09

去掉if就好了,它是没用的。

这个警告来自Resharper,它警告你,如果枚举attributeList的代价很高,那么你的代码将会很慢。(因为它为Any()枚举一次,为foreach枚举第二次)

票数 6
EN

Stack Overflow用户

发布于 2012-04-23 20:50:55

原因是调用attributeList.Any()启动了attributeList,一旦它找到了什么东西,它就会进入您的for循环。然后对列表执行foreach,再次遍历整个列表。

在这里你实际上不需要.Any(),因为在一个空枚举数上做一个foreach不会引起任何问题,它只是不会返回任何东西。

你可能会遇到问题的地方是,如果你从一个数据库中提取数据,并且在foreach内部对枚举进行了另一次调用,因为它是延迟执行的,所以你可能会在第二次调用时得到不同的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10280844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档