none
Извлечение по критерию из набора данных RRS feed

  • Вопрос

  • Как лучше и быстрее проделать следующую операцию: есть набор элементов, который можно оформить как угодно (массив, список, очередь и т.д.). Элементами этого набора являются объекты типа такого:

     

      public enum Attribute
      {
        One,
        Two,
        Three
      }
    
      public class Element
      {
        public int Number;
        public string Name;
        public int Attribute;
      }
    

     

    Нужно по какому-либо критерию (изначально известному) извлечь из него некоторые элементы.  В результате, на выходе, я должен получить две ConcurrentQueue - одна это результат извлечения по критерию, а вторая должна содержать оставшиеся элементы.

    К примеру, извлечь все элементы, имеющие Attribute=One. Обыный запрос может их найти, но он их не извлекает, а мне надо, чтобы они были удалены из исходного набора.

    var ElementsWithAttributeOne = Набор.Where(Element => Element.Attribute == Attribute.One);
    

    И вторая проблема, я не знаю, как быстро преобразовать полученный var в ConcurrentQueue, а также как преобразовать оставшийся набор элементов во вторую ConcurrentQueue. Делать преобразование через перебор элементов и Enqueue каждого элемента не хочется.

     

    17 февраля 2011 г. 0:46

Ответы

  • попробуйте так

    public enum Attribute
      {
        One,
        Two,
        Three
      }
    
      public class Element
      {
        public int Number;
        public string Name;
        public Attribute Attribute;
      }
     
      class Program
      {
        static void Main(string[] args)
        {
          List<Element> source = new List<Element>()
          {
            new Element(){ Attribute= Attribute.One, Name="One", Number = 1},
            new Element(){ Attribute= Attribute.One, Name="One", Number = 2},
            new Element(){ Attribute= Attribute.Two, Name="Two", Number = 3},
            new Element(){ Attribute= Attribute.Three, Name="Three", Number = 4},
            new Element(){ Attribute= Attribute.One, Name="One", Number = 5}
          };
          var query = source.Where((e) => e.Attribute == Attribute.One);
          ConcurrentQueue<Element> queue1 =
            new ConcurrentQueue<Element>(query);
          ConcurrentQueue<Element> queue2 =
            new ConcurrentQueue<Element>(source.Except(query));
    
          Console.Read();
        }
      }
    

    • Помечено в качестве ответа Qwester33 17 февраля 2011 г. 7:50
    17 февраля 2011 г. 6:05