Search code examples
c#containsconcurrent-queue

Using Contains<T> method in a ConcurrentQueue if T is a class or structure


I badly understand ConcurentQueue collection. How to use Contains method in a ConcurrentQueue if T is a class or structure?

My code:

    namespace lab2Form
    {
        struct DomainName
        {
            public string domainName;
            public ulong domainNameCounter;
        }

        class LogStruct
        {
            public ConcurrentQueue<DomainName> domainNameQueue;
            //some code

            public LogStruct()
            {
                domainNameQueue = new ConcurrentQueue<DomainName>() { };
                //some code
            }
        }

        class CLogParser
        {
            LogStruct m_logStruct;

            public CLogParser()
            {
                 m_logStruct = new LogStruct();
            }

            public void ThreadProc(object param)
            {
                //...
                string line;
                while ((line = file.ReadLine()) != null)
                {
                    var space_pos = line.IndexOf(' ');
                    if (space_pos > 0)
                    {
                      string[] parameters = line.Split(new Char[] { ' ' },            StringSplitOptions.RemoveEmptyEntries);
                      string domainName = parameters[0];
                      if (m_logStruct.domainNameQueue.Contains<DomainName>(domainName))//I can't understand how to build this code-string correctly
                      {
                      }
               //...
}

How to use contains method in concurrentqueue correctly?


Solution

  • You are passing a string while Contains method expects a DomainName. This should compile:

    m_logStruct.domainNameQueue.Contains<DomainName>(new DomainName {domainName = domainName})
    

    However this won't be very useful if you want to check for domainName equality. You can override Equals in DomainName:

    struct DomainName
    {
        public string domainName;
        public ulong domainNameCounter;
    
        public override bool Equals(object obj)
        {
            if (obj is DomainName)
            {
                return ((DomainName) obj).domainName == domainName;
            }
    
            return false;
        }
    }