如何选择具有特定条件的项目并在转换为队列后不久?
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;
答案 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
,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,并且不会将特定项添加到队列中。