134 votes

Comment retirer un objet unique et spécifique d'un ConcurrentBag<> ?

Avec le nouveau ConcurrentBag<T> dans .NET 4, comment supprimer un certain objet spécifique de celui-ci lorsque seulement TryTake() y TryPeek() sont disponibles ?

Je pense utiliser TryTake() et ensuite ajouter l'objet résultant dans la liste si je Ne le fais pas. veulent l'enlever, mais j'ai l'impression que je pourrais manquer quelque chose. Est-ce la bonne méthode ?

-1voto

huda Points 9
public static void Remove<T>(this ConcurrentBag<T> bag, T item)
{
    while (bag.Count > 0)
    {
        T result;
        bag.TryTake(out result);

        if (result.Equals(item))
        {
            break; 
        }

        bag.Add(result);
    }

}

-4voto

huda Points 309

C'est ma classe d'extension que j'utilise dans mes projets. Elle peut supprimer un seul élément du ConcurrentBag et peut également supprimer une liste d'éléments du sac.

public static class ConcurrentBag
{
    static Object locker = new object();

    public static void Clear<T>(this ConcurrentBag<T> bag)
    {
        bag = new ConcurrentBag<T>();
    }

    public static void Remove<T>(this ConcurrentBag<T> bag, List<T> itemlist)
    {
        try
        {
            lock (locker)
            {
                List<T> removelist = bag.ToList();

                Parallel.ForEach(itemlist, currentitem => {
                    removelist.Remove(currentitem);
                });

                bag = new ConcurrentBag<T>();

                Parallel.ForEach(removelist, currentitem =>
                {
                    bag.Add(currentitem);
                });
            }

        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

    public static void Remove<T>(this ConcurrentBag<T> bag, T removeitem)
    {
        try
        {
            lock (locker)
            {
                List<T> removelist = bag.ToList();
                removelist.Remove(removeitem);                

                bag = new ConcurrentBag<T>();

                Parallel.ForEach(removelist, currentitem =>
                {
                    bag.Add(currentitem);
                });
            }

        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }
}

-6voto

Evgeniy Nikulov Points 19
public static ConcurrentBag<String> RemoveItemFromConcurrentBag(ConcurrentBag<String> Array, String Item)
{
    var Temp=new ConcurrentBag<String>();
    Parallel.ForEach(Array, Line => 
    {
       if (Line != Item) Temp.Add(Line);
    });
    return Temp;
}

-15voto

Simon Gullive Points 1

Comment :

bag.Where(x => x == item).Take(1);

Ça marche, je ne suis pas sûr de l'efficacité...

2 votes

Cela n'enlève rien au sac. L'objet que vous récupérez reste à l'intérieur du sac.

5 votes

Devrait être "bag = new ConcurrentBag(bag.Where(x => x != item))".

6 votes

@atikot, cette phrase m'a fait rire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X