C#使用哪个循环?

时间:2016-06-23 01:51:36

标签: c#

我无法使用这种类型的循环(foreach)删除项目,我应该使用哪个循环? (这将返回我的变量),如果这是有道理的。谢谢大家的帮助非常感谢!对我来说很容易,我不太有经验。如果这没有意义我真的试图找到任何方法基本上使我的程序,以便对于每个IP地址,它将尝试我的用户名和密码组合(加载到列表,如用户:通过),我'这样做是因为我过去使用不同的用户/密码设置了数百个代理。我正在检查他们是否仍在工作。感谢

[Export(typeof(IClassifierProvider))]
[ContentType(MyConstants.MyContentType)]
public sealed class MyClassifierProvider : IClassifierProvider
{
    public IClassifier GetClassifier(ITextBuffer textBuffer)
    {
        return new MyClassifier(textBuffer);
    }
}

3 个答案:

答案 0 :(得分:4)

不要修改用于迭代的集合,无论您使用何种循环。要实现您的目标,只需将工作数据添加到另一个列表中即可。

var working = new ConcurrentBag<IpItem>(); // not sure what your type is
[....]
using (var client = new ProxyClient(ip, u, p))
                        {
                            Console.WriteLine(u + p + ip_item.IP);
                            client.Connect();
                            ip_item.AcceptsConnection = client.IsConnected;
                            client.Disconnect();
                            working.Add(ip_item);
                        }

然后,最后,从工作中获取所有工作结果,并根据需要输出

答案 1 :(得分:1)

不,您不能使用foreach循环从集合中删除项目;非常基本的原因,因为foreach的循环迭代器是ReadOnly。您应该选择使用for循环来实现此目的。

检查MSDN reference for foreach。正如它清楚地说的那样

  

foreach语句用于迭代集合以获取   您想要的信息,但不能用于添加或删除   来自源集合的项目,以避免不可预测的副作用。   如果需要在源集合中添加或删除项目,请使用   for循环。

答案 2 :(得分:0)

考虑使用其他列表来识别失败。

var l = loadips();
var t = func();

var faileds = new ConcurrentQueue<YourClass>();

Parallel.ForEach(l.ToArray(), (ip_item) =>
{
    try
    {
        ...
    }
    catch
    {
        Console.WriteLine(ip_item.IP + " - BAD!");
        faileds.Enqueue(ip_item);
    }
});

foreach (var item in l.Except(faileds))
{
    if (item.AcceptsConnection == true)
    {
        Console.WriteLine(ip + " Working proxy.");
    }
}

对于&#34;所有组合&#34;,我建议您先列出所有组合。

var combinations = l.SelectMany(ipItem =>
    t.Select(blah2 => Tuple.Create(ipItem, blah2)).ToArray();

foreach (var combination in combinations)
{
    var ip = combination.Item1.IP;
    var fc = combination.Item2.Split(':');
    var u = fc[0];
    var p = fc[1];
    ...
}