C# 如何选择相同的列表,但有一个附加变量集?

C# 如何选择相同的列表,但有一个附加变量集?,c#,linq,C#,Linq,我有一个列表 MyObject如下所示 public class MyObject { public bool available; public bool online; } 现在,当我从另一个函数中检索此列表时,只设置了可用的字段。现在我想将每个MyObject的字段设置为online 我现在做的是 List<MyObject> objectList = getMyObjectList(); objectList.ForEach(x => x.online =

我有一个
列表

MyObject
如下所示

public class MyObject
{
   public bool available;
   public bool online;
}
现在,当我从另一个函数中检索此
列表时,只设置了
可用的
字段。现在我想将每个
MyObject
字段设置为online

我现在做的是

List<MyObject> objectList = getMyObjectList();
objectList.ForEach(x => x.online = IsOnline(x));
虽然我知道上面的代码是有效的和可读的,但我很想知道是否有一种LINQ方法可以选择相同的对象,但需要初始化一个变量,以便将所有三行合并到一行。不幸的是,
ForEach
没有返回列表

差不多

getMyObjectList().BetterForEach(x => x.online = IsOnline(x)).Where(x => x.available && x.online);
BetterForEach
将返回
x
,并设置先前的值和
online
字段

是否有任何方法/功能可以使用LINQ实现这一点

更新

我删除了MyObject的其他字段。MyObject不仅包含这些字段,还包含更多字段。我不希望创建MyObject的新实例。

Linq用于查询数据,而不是更新数据。所以你的任何选择都不会太漂亮,但仍然有一些选择

您可以这样做:

var result = 
    objectList.Select(x => 
    {
        x.online = IsOnline(x);
        return x;
    });
然而,这是非常糟糕的做法。这样会更好:

var result = 
    objectList.Select(x => new MyObject
    {
        available = x.available,
        online = IsOnline(x)
    });
但这会创建一个新对象集合,与原始集合无关


这类代码通常表示您的基本设计可能有问题。就我个人而言,我会这样做(如果您可以设置一个静态方法来完成
IsOnline
的工作):

或者,如果无法设置静态方法,那么该字段可能根本不需要位于
MyObject
类中

public class MyObject
{
   public bool Available;
}
...
var result = objectList.Where(x => x.Available && IsOnline(x));
假设您需要在结果列表中联机访问

您还可以向MyObject添加一个方法,如:

public MyObject SetOnline(bool isOnline) {
   this.online = isOnline;
   return this;
}
然后做:

var selected = getMyObjectList()
    .Select(x => x.SetOnline( IsOnline(x) ))
    .Where(x => x.available && x.online);

最简单的解决方案可能是创建一个类似于
ForEach
的扩展方法,但返回链接列表:

public static List<T> ForEachThen<T>(this List<T> source, Action<T> action)
{
    source.ForEach(action);
    return source;
}
公共静态列表ForEachThen(此列表源,操作)
{
来源:ForEach(行动);
返回源;
}

公共MyObject
的语法无效。这不起过滤作用,是吗?@C4stor否,不起作用。我只关注如何更新源代码列表。@C4stor:我对过滤部分不感兴趣,所以他显然没有关注这一部分。我同意第一种方法是不好的做法,但是+1因为它有效。;)你的最后两段代码让我重新思考了设计。谢谢我继续进行最后一步。这个问题背后的原因是可用性状态来自数据库,但是联机状态必须通过我拥有的XMPP连接对象进行查询。此代码没有编译(简单错误,
Action
应该是
Action
),加上OP特别询问了除了使用
ForEach
之外如何实现这一点,我不认为用不同的方法包装它可以实现这一点。OP特别询问了一个方法
,因此我可以将所有三行合并到一行。这将允许这样做,同时仍然很明显这是一个非LINQ
ForEach
public MyObject SetOnline(bool isOnline) {
   this.online = isOnline;
   return this;
}
var selected = getMyObjectList()
    .Select(x => x.SetOnline( IsOnline(x) ))
    .Where(x => x.available && x.online);
public static List<T> ForEachThen<T>(this List<T> source, Action<T> action)
{
    source.ForEach(action);
    return source;
}