Выбор элемента из списка и преобразование в очередь - PullRequest
0 голосов
/ 05 июля 2018

Как сделать, чтобы выбрать элементы, которые имеют определенные критерии и вскоре после преобразования в очередь?

public class Assinante
    {
        public int ID { get; set; }
        public string Nome { get; set; }
        public string Email { get; set; }
        public string CPF { get; set; }
        public string NossoNumero { get; set; }
        //public string Enviado { get; set; }
        public Status Pendente { get; set; }

        public Assinante(int id, string nome, string email, string cpf, string nossonumero, Status status)
        {
            this.ID = id;
            this.Nome = nome;
            this.Email = email;
            this.CPF = cpf;
            this.NossoNumero = nossonumero;
            this.Pendente = status;
        }
    }

public static Queue<Assinante> CreatQueueList()
{
    return new Queue<Assinante>(assinantes.Where(x => 
        x.Pendente != Status.Sent || 
        x.Pendente != Status.NotFound && 
        !string.IsNullOrEmpty(x.Email) &&
        !string.IsNullOrEmpty(x.NossoNumero)));
}

Я пробовал этот способ, однако возвращение все еще не так, как я хочу ... это возвращение объектов, электронная почта которых равна нулю

но я искал более красивый способ сделать это

Queue<Assinante> q = new Queue<Assinante>();
            foreach (var assinante in assinantes)
            {
                if (!string.IsNullOrEmpty(assinante.Email) && !string.IsNullOrEmpty(assinante.NossoNumero))
                {
                    q.Enqueue(assinante);
                }
            }

            return q;

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Использование логических операторов кажется неправильным, вы можете попробовать этот пересмотренный запрос.

return new Queue<Assinante>(assinantes.Where(x => 
        !(x.Pendente = Status.Sent 
        || x.Pendente = Status.NotFound 
        || string.IsNullOrEmpty(x.Email)
        || string.IsNullOrEmpty(x.NossoNumero))));

Если вы посмотрите на предложение where, если какой-либо из параметров имеет значение true, тогда все условие будет ложным, и этот конкретный элемент не будет добавлен в очередь.

0 голосов
/ 05 июля 2018

Это почти наверняка случай логического оператора.

В C # логическое И (&&) имеет приоритет над логическим ИЛИ (||).

Это должно помочь вам понять:

bool result = true || true && false;   // --> true 
bool result = (true || true) && false; // --> false
bool result = true || (true && false); // --> true

И в вашем примере у вас есть утверждение, похожее на:

A || B && C && D

Сначала будет оцениваться

B && C && D, а затем результат || с A.

Итак, возвращаясь к вашему оригиналу,

x.Pendente != Status.Sent || 
x.Pendente != Status.NotFound && !string.IsNullOrEmpty(x.Email) && !string.IsNullOrEmpty(x.NossoNumero))

По сути, вы выбираете;

  • либо объекты, чьи Status != Sent,
    OR
  • объекты, чьи Status != NotFound И Email не являются нулевыми или пустыми И NossoNumero не являются нулевыми или пустыми.

Итак, первая часть позволяет объекту, чей электронный адрес является нулевым, быть выбранным в вашем предложении Where.


EDIT

Также обратите внимание, что если вы сгруппируете x.Pendente != Status.Sent || x.Pendente != Status.NotFound вместе, это тоже может быть проблемой. OR операция на двух not с не имеет большого смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...