提高代码质量:比较两个元素列表

3

抱歉问一个新手问题,我是编程新手。

我想检查 listOfDifferentTypes 中是否已经没有超过一个 TypeA 元素。我有以下代码:

     public void CheckType ( Object param)
     {
            if ( param is TypeA )
            {
                int i = 0;
                TypeA paramToCheck = ( TypeA ) param;

                foreach ( var paramB in listOfDifferentTypes )
                {
                    if ( paramB is TypeA )
                    {
                        var paramInList = ( TypeA ) paramB;
                        if ( paramToCheck.ID == paramInList.ID )
                        {
                            i++;
                        }
                    }
                }
                if ( i > 1 )
                {
                    paramToCheck.m_Error = "ErrorText";
                }    
            }
    }

我认为这不是一个很干净的解决方案。这段代码能否被改进/优化?

2个回答

2
你可以使用LINQ来实现这个功能 :) 它看起来会很好:
//Checks for string - resplace <string> with <some type> for other types
private bool moreThanOne(List<object> differentTypes)
{
    return differentTypes.OfType<string>().Count() > 1;
}

使用方法:

List<object> listOfDifferentTypes = new List<object> { "string", 13, 52, "string", 54.3f };

var res = moreThanOne(listOfDifferentTypes);

我看到你也检查了某种ID,那么尝试这个: 更新以执行你的代码所做的操作 更新:用 .Skip(1).Any() 替换了 .Count(),这样如果找到多个就会停止 :)
private void CheckType(object param, List<object> differentTypes)
{
    var paramToCheck = param as TypeA;

    if (paramToCheck == null) return;

    var res = differentTypes.OfType<TypeA>().Where(t => t.ID == paramToCheck.ID).Skip(1).Any();

    if (res) paramToCheck.m_Error = "error text";
}

就像我所做的一样,您可以替换:

if (param is TypeA)
{
    TypeA paramToCheck = (TypeA) param;
    ... Do something

使用:

TypeA paramToCheck = param as TypeA; //Returns null if not a TypeA
if (param == null) return;

... Do something

它稍微快了一点 :)


1

您的原始解决方案,已经重写:

public void CheckType(Object param)
{
   TypeA paramToCheck = param as TypeA;
   int count = 0;
   if (paramToCheck != null)
   {
       foreach (var paramB in listOfDifferentTypes)
       {
           var paramInList = paramB as TypeA;
           if (paramInList != null && paramToCheck.ID == paramInList.ID)
           {
               count++;

               if (count > 1)
               {
                   paramToCheck.m_Error = "ErrorText";
                   break;
               }
           }
       }
   }

}

注意事项:

  • 使用as关键字与null进行比较以执行类型转换,
  • 将多个条件合并为单个if语句(使用AND (&&)运算符),
  • 使用break语句在满足条件后立即退出foreach循环。
  • 这只是您原始代码的清理版本;毫无疑问,有更好的方法来实现您想要的行为 :-)

编辑:根据评论更新(感谢指出我的先前错误!)


嗯,它们并不完全相同?如果有一个或多个实例,你的代码会写入错误。而他的代码只有在存在超过一个实例时才会写入错误。如果我错了,请纠正我 :) - Lasse Espeholt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接