条件运算符(?:)没有返回值

时间:2012-10-08 20:26:33

标签: c# linq

首先,我刚刚开始乱用LINQ,我真的不明白它。

无论如何,我要做的是添加一个带有LINQ和.Where语句的List。

这是我尝试过的:

List<object> FirstList = new List<object>();
List<object> SecondList = new List<object>();
Listener.Clients.Where(x => (x.Value.Authenticated) ? FirstList.Add(x.Value.UserID) : SecondList.Add(x.Value.UserID));

Listener是一个套接字包装类,而Clients是一个类Client的数组。

在那个Client类中有一些我需要的值,我想检查该客户端是否经过身份验证(登录),如果是,请将其添加到第一个列表,如果不是,请添加它到第二个列表,但似乎?:运算符必须有一个返回值,但添加到列表不会返回任何内容。

我希望我解释得那么好;用言语我不是最好的。

3 个答案:

答案 0 :(得分:6)

IEnumerable.Where仅用于过滤符合特定条件的List元素。你试图在Where子句中操作,这是不正确的。

我猜你想要的东西是:

var firstList = 
    Listener
        .Clients
        .Where(c => c.Value.Authenticated).Select(c => c.Value.UserID).ToList();
var secondList = 
    Listener
        .Clients
        .Where(c => !c.Value.Authenticated).Select(c => c.Value.UserID).ToList();

答案 1 :(得分:3)

您正在尝试使用一个枚举创建两个(或更多)列表。请考虑使用ToLookup代替:

ILookup<bool, Client> lookup = source.ToLookup(c => c.Value.Authenticated);
List<Client> firstList = lookup[true].ToList();
List<Client> secondList = lookup[false].ToList();

当一个未知密钥被发送到查找时,它将返回一个空集合。


您需要UserIds而不是Clients,因此请使用选择值的ToLookup重载。

ILookup<bool, string> lookup = source
  .ToLookup(c => c.Value.Authenticated, c => c.Value.UserId);
List<string> firstList = lookup[true].ToList();
List<string> secondList = lookup[false].ToList();

答案 2 :(得分:0)

此IEnumerable.Where扩展方法用于检索已过滤的元素列表,并将匿名方法作为参数,该方法必须接收元素类型并返回bool。