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;
}
}
}
}