构建没有&;if&;的算法

本文关键字:算法 if 构建 | 更新日期: 2023-09-27 17:51:18

List<IClient>List<ClientName>当新客户端连接到Service(Server)时,新客户端的名称将被写入会话中的所有客户端。但新客户只能得到你自己。我有:

foreach (IClientCallBack client in listClientCallBacks)
{
    if (client == listClientCallBacks.Last())
    {
        foreach (var n in listClientsName)
        {
            client.Enter(n);
        }
        return;
    }
    client.Enter(name);
}

请提示在这种情况下是否有没有if的变体?提前感谢。PS:抱歉我的英语水平。

构建没有&;if&;的算法

如果你真的想删除如果你可以写两个单独的循环(这并不意味着你有显著的性能下降,因为你的代码也执行两个循环),是的,如果我猜对了你的意图,使用这个逻辑更清楚。

// Get directly the last one and add the clients name already in the 'session'
// to this element. I suppose that the last one need to be informed of the
// clients already in the list.....
IClientCallBack client in listClientCallBacks.Last();
foreach (var n in listClientsName)
    client.Enter(n);
// Now for every client in the session EXCLUDING  the last one 
// inform them of the new client that has joined your 'session'
foreach (IClientCallBack client in listClientCallBacks.Take(listClientCallBacks.Length - 2))
    client.Enter(name);

foreach循环可能非常有用,但在某些情况下,良好的旧for循环也有其优势。例如,当您不处理集合中的每一项时,或者您需要当前元素的索引时。

如果我正确理解了你的问题,你需要对最后一个元素进行特殊处理:

// first until second last element
int secondLastIndex = listClientCallBacks.Count - 2;
for (int index = 0; index <= secondLastIndex; index++)
{
    IClientCallBack client = listClientCallBacks[index];
    client.Enter(name);
}
// last element
if (listClientCallBacks.Count > 0)
{
    IClientCallBack lastClient = listClientCallBacks.Last();
    foreach (var n in listClientsName)
    {
        lastClient.Enter(n);
    }
    return;
}