从列表中选择项目并转换为队列

时间:2018-07-05 17:03:11

标签: c# list

如何选择具有特定条件的项目并在转换为队列后不久?

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 :(得分:1)

这几乎肯定是逻辑运算符优先级的情况。

在C#中,逻辑AND(&&)优先于逻辑OR(||)。

这应该可以帮助您了解:

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 AND Email不为空或为空的对象 AND NossoNumero不为空或为空的对象。

因此,第一部分允许在Where子句中选择电子邮件为空的对象。


编辑

此外,请注意,如果将x.Pendente != Status.Sent || x.Pendente != Status.NotFound分组在一起,也可能是一个问题。在两个OR上进行not操作没有多大意义。

答案 1 :(得分:0)

使用逻辑运算符似乎不正确,您可以尝试使用此修订查询。

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,则整个条件为false,并且不会将特定项添加到队列中。