C# 改进代码:比较2个元素列表

C# 改进代码:比较2个元素列表,c#,optimization,C#,Optimization,对不起,我是个新手,但我对编程还不熟悉 我想检查不同类型的列表中是否已经没有超过一个TypeA元素。我有以下代码: public void CheckType ( Object param) { if ( param is TypeA ) { int i = 0; TypeA paramToCheck = ( TypeA ) param;

对不起,我是个新手,但我对编程还不熟悉

我想检查不同类型的
列表中是否已经没有超过一个
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";
                }    
            }
    }

我认为这不是一个非常干净的解决方案。这个代码可以改进/优化吗

您可以将LINQ用于此:)它看起来会很漂亮:

//Checks for string - resplace <string> with <some type> for other types
private bool moreThanOne(List<object> differentTypes)
{
    return differentTypes.OfType<string>().Count() > 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
    循环
  • 这只是原始代码的清理版本;毫无疑问,有更好的方法来实现你想要的行为:-)

编辑:更新回复:评论(感谢您指出我以前的错误!)

Hhm不完全一样吗?如果有一个或多个实例,代码将写入错误。如果有多个实例,他的代码将写入错误。如果我错了,请纠正我:)
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
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;
               }
           }
       }
   }