Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这在C中正确使用GOTO吗#_C#_Goto - Fatal编程技术网

C# 这在C中正确使用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!=

我正在跟踪一些代码,并向下面发送了一个列表,以从列表中删除某些项目

这是使用goto的正确方式吗?有必要吗?难道你不只是把第二个if编辑成一个else-if,然后继续处理这个列表而不需要goto吗?(这是我第一次在BASIC之外看到goto。)

公共静态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();
}