我有以下代码,它在标题中给出了警告。我很确定我以前做过这样的事情,但它没有给出任何警告。我想就这些帖子问两件事。1)这里什么会导致问题? 2)需要修复吗?
我问这个问题的原因是,这段代码运行得很好,因为我希望它如此清楚地表明,这条警告不会导致问题。我不能忍受在我的代码中有警告等,所以我想要一个解决方案,但我也想知道为什么会出现这个警告,以及它是否在任何方面都是有害的。
代码:
 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;
        }
}编辑:方法中有更多代码,但与此问题无关。
更新:我必须添加下面的代码才能让它工作。为什么添加这个更有效?如果我必须计算和读取新的列表,那么对原始项目进行计数和读取有什么不同?该列表仅传递一次。如果列表是在方法中填充的,但不是,我可以理解这个问题。它只是传入了已填充的内容。
List<AttributeType> newlist = attributeList.ToList();
if (newlist.Count() != 0)
{
    foreach (AttributeType attribute in newlist)
............发布于 2012-04-23 20:50:51
可能的问题取决于您的IEnumerable来自何处。一些数据源可能只允许单个枚举,或者它们可能很昂贵(可能是一些数据库查询),这可能已经由attributeList.Any()启动。
您可以删除Any()检查,因为如果您的IEnumerable中没有元素,那么您的循环无论如何都不会运行(假设您的示例显示了完整的情况,并且没有其他依赖于该检查的逻辑)。
编辑:根据您编辑的问题,您不能删除复选标记。但是,您可以使用attributeList.ToArray()将IEnumerable转换为数组,然后使用该数组并消除警告。
发布于 2012-04-23 20:49:09
去掉if就好了,它是没用的。
这个警告来自Resharper,它警告你,如果枚举attributeList的代价很高,那么你的代码将会很慢。(因为它为Any()枚举一次,为foreach枚举第二次)
发布于 2012-04-23 20:50:55
原因是调用attributeList.Any()启动了attributeList,一旦它找到了什么东西,它就会进入您的for循环。然后对列表执行foreach,再次遍历整个列表。
在这里你实际上不需要.Any(),因为在一个空枚举数上做一个foreach不会引起任何问题,它只是不会返回任何东西。
你可能会遇到问题的地方是,如果你从一个数据库中提取数据,并且在foreach内部对枚举进行了另一次调用,因为它是延迟执行的,所以你可能会在第二次调用时得到不同的结果。
https://stackoverflow.com/questions/10280844
复制相似问题