2

首先,我刚刚开始使用 LINQ,但我并不真正了解它。

无论如何,我想做的是使用 LINQ 和 .Where 语句添加到列表中。

这是我尝试过的:

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

我希望我解释得很好;我不是最会说话的。

4

3 回答 3

6

IEnumerable.Where仅用于过滤列表中与特定条件匹配的元素。您试图在 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();
于 2012-10-08T20:28:04.160 回答
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();
于 2012-10-08T20:41:11.177 回答
0

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

于 2012-10-08T20:31:17.750 回答