C# 这在C中正确使用GOTO吗#
我正在跟踪一些代码,并向下面发送了一个列表,以从列表中删除某些项目 这是使用goto的正确方式吗?有必要吗?难道你不只是把第二个if编辑成一个else-if,然后继续处理这个列表而不需要goto吗?(这是我第一次在BASIC之外看到goto。)C# 这在C中正确使用GOTO吗#,c#,goto,C#,Goto,我正在跟踪一些代码,并向下面发送了一个列表,以从列表中删除某些项目 这是使用goto的正确方式吗?有必要吗?难道你不只是把第二个if编辑成一个else-if,然后继续处理这个列表而不需要goto吗?(这是我第一次在BASIC之外看到goto。) 公共静态IList筛选器OneedSendbacktoClient(IList src) { 如果(src==null) 返回null; 检查AB01: 对于(int i=0;i0 && info.CancelledByReliantSyncAB01!=
公共静态IList筛选器OneedSendbacktoClient(IList src)
{
如果(src==null)
返回null;
检查AB01:
对于(int i=0;i0
&&
info.CancelledByReliantSyncAB01!=null&&info.CancelledByReliantSyncAB01.Value==true
)
{
src.Remove(信息);
转到checkAB01;
}
if((info.PartnerContract==null | | info.PartnerContract.Trim().Length==0)
&&
(info.ProductNumber==null | | info.ProductNumber.Trim().Length==0))
{
src.Remove(信息);
转到checkAB01;
}
}
返回src;
}
不,这不是使用goto的正确方法,它只是不知道如何从列表中正确删除项目的人的替代品。(向后迭代以防止跳过元素)
公共静态IList筛选器OneedSendbacktoClient(IList src)
{
如果(src==null)
返回null;
对于(int i=src.Count-1;i>=0;i--)
{
客户信息=src[i];
如果(info.ProductNumber!=null&&info.ProductNumber.ToLower().Trim().Length>0
&&
info.CancelledByReliantSyncAB01!=null&&info.CancelledByReliantSyncAB01.Value==true
)
{
src.RemoveAt(i);
}
if((info.PartnerContract==null | | info.PartnerContract.Trim().Length==0)
&&
(info.ProductNumber==null | | info.ProductNumber.Trim().Length==0))
{
src.RemoveAt(i);
}
}
返回src;
}
不,这不是使用goto的正确方法,它只是不知道如何从列表中正确删除项目的人的替代品。(向后迭代以防止跳过元素)
公共静态IList筛选器OneedSendbacktoClient(IList src)
{
如果(src==null)
返回null;
对于(int i=src.Count-1;i>=0;i--)
{
客户信息=src[i];
如果(info.ProductNumber!=null&&info.ProductNumber.ToLower().Trim().Length>0
&&
info.CancelledByReliantSyncAB01!=null&&info.CancelledByReliantSyncAB01.Value==true
)
{
src.RemoveAt(i);
}
if((info.PartnerContract==null | | info.PartnerContract.Trim().Length==0)
&&
(info.ProductNumber==null | | info.ProductNumber.Trim().Length==0))
{
src.RemoveAt(i);
}
}
返回src;
}
我认为编写此代码的人不知道如何从迭代集合中删除项。这些GOTO的原因是,一旦删除一个项目,集合就会变小,这可能会导致迭代错误
一个更好的方法是做一个反向循环。这样,删除后,您不必在整个列表中重复。下面的代码可以正常工作
for (int i = src.Count - 1; i >= 0; i--) {
src.Remove(src[i]);
}
我认为编写这段代码的人不知道如何从迭代集合中删除项。这些GOTO的原因是,一旦删除一个项目,集合就会变小,这可能会导致迭代错误 一个更好的方法是做一个反向循环。这样,删除后,您不必在整个列表中重复。下面的代码可以正常工作
for (int i = src.Count - 1; i >= 0; i--) {
src.Remove(src[i]);
}
正如其他人所说,这是一个糟糕的使用
goto
(应该很少使用,如果有的话)
但总体而言,实施效率极低。看起来它从0..N循环,直到删除某个内容,然后从0..N(现在少1个)再次开始,直到删除某个内容,依此类推。更糟糕的是,Remove
调用再次从0..N开始寻找要删除的项目
如果它没有发现要删除的内容,则返回。最好是使用RemoveAt
执行反向循环删除条目,然后返回
public static IList<ClientEntity> FilterNoNeedSendBackToClients(IList<ClientEntity> src)
{
if (src == null)
return null;
for (int i = src.Count - 1; i >= 0; i--)
{
ClientEntity info = src[i];
if (info.ProductNumber != null && info.ProductNumber.ToLower().Trim().Length > 0
&&
info.CancelledByReliantSyncAB01 != null && info.CancelledByReliantSyncAB01.Value == true)
{
src.RemoveAt(i);
}
else if ((info.PartnerContract == null || info.PartnerContract.Trim().Length == 0)
&&
(info.ProductNumber == null || info.ProductNumber.Trim().Length == 0))
{
src.RemoveAt(i);
}
}
return src;
}
甚至可以考虑调整<代码> SubdCordNoTunsEdBut后缀方法和/或名称(甚至可以移动两组<代码>如果检查到具有明确名称的个别方法),但我认为这是一个显著的整体改进。
<> > Edx2:事实上,我会强烈地考虑使用该方法。该方法显然是在接收输入集合时返回一个
IList
,这通常会向开发人员传达这样的信息,即这是在创建一个新列表,而实际上它是在修改现有列表并返回相同的列表实例。要么让它返回一个新列表(因此您应该更改循环代码以添加到一个新列表中,而不是从现有列表中删除),要么删除返回类型,这样它就更明显地改变了传递的列表参数。正如其他人所说,这是goto
的糟糕用法(应该很少使用它)
但总体而言,实施效率极低。看起来它从0..N循环,直到删除某个内容,然后从0..N(现在少1个)再次开始,直到删除某个内容,依此类推。更糟糕的是,Remove
调用再次从0..N开始寻找要删除的项目
如果它没有发现要删除的内容,则返回。最好是使用RemoveAt
执行反向循环删除条目,然后返回
public static IList<ClientEntity> FilterNoNeedSendBackToClients(IList<ClientEntity> src)
{
if (src == null)
return null;
for (int i = src.Count - 1; i >= 0; i--)
{
ClientEntity info = src[i];
if (info.ProductNumber != null && info.ProductNumber.ToLower().Trim().Length > 0
&&
info.CancelledByReliantSyncAB01 != null && info.CancelledByReliantSyncAB01.Value == true)
{
src.RemoveAt(i);
}
else if ((info.PartnerContract == null || info.PartnerContract.Trim().Length == 0)
&&
(info.ProductNumber == null || info.ProductNumber.Trim().Length == 0))
{
src.RemoveAt(i);
}
}
return src;
}
甚至可以考虑修改<代码> SubdCclitNoTunsEdBut后缀方法和/或名称
public static IList<ClientEntity> FilterNoNeedSendBackToClients(IList<ClientEntity> src)
{
if (src == null)
return null;
for (int i = src.Count - 1; i >= 0; i--)
{
if (ShouldClientNotSendBack(src[i]))
src.RemoveAt(i);
}
return src;
}
private static bool ShouldClientNotSendBack(ClientEntity info)
{
if (!String.IsNullOrWhiteSpace(info.ProductNumber) && info.CancelledByReliantSyncAB01 == true)
{
return true;
}
if (!String.IsNullOrWhiteSpace(info.PartnerContract))
{
return true;
}
return false;
}
public static IList<ClientEntity> FilterNoNeedSendBackToClients(IList<ClientEntity> src)
{
if (src == null)
return null;
for (int i = src.Count-1; i>=0; i--)
{
ClientEntity info = src[i];
if (info.ProductNumber != null && info.ProductNumber.ToLower().Trim().Length > 0
&&
info.CancelledByReliantSyncAB01 != null && info.CancelledByReliantSyncAB01.Value == true
)
{
src.Remove(info);
continue;
}
if ((info.PartnerContract == null || info.PartnerContract.Trim().Length == 0)
&&
(info.ProductNumber == null || info.ProductNumber.Trim().Length == 0))
{
src.Remove(info);
continue;
}
}
return src;
}
public static IList<ClientEntity> FilterNoNeedSendBackToClients(IList<ClientEntity> src)
{
if (src == null)
return null;
return (from info in src.AsEnumerable<ClientEntity>()
where !(!String.IsNullOrWhiteSpace(info.ProductNumber) &&
info.CancelledByReliantSyncAB01 == (bool?)true)
where !(String.IsNullOrWhitespace(info.PartnerContract) &&
String.IsNullOrWhiteSpace(info.ProductNumber))
select info).ToList();
}