如何将预测结果复制到 C# 中的另一个变量?

How do I copy projected results into another variable in c#?

下面的代码不会 运行,因为它抱怨我正在尝试将 Anon 类型添加到客户端类型中。在最初投影某些结果并丢失原始类型后,如何将它们存储在另一个变量中。

(PS。我已经让我的示例变得简单,但实际上我正在处理一个更复杂的案例。在我的实际案例中,不投影不是一个选项。编辑以提供澄清.)

var clients = Clients.Where(c => c.FirstName.StartsWith("Mark"))
.Select(c => new {
    LastName = c.LastName.ToUpper(),
    c.DateAdded,
    c.FirstName,
})
.ToList();
var certainClients = new List<Clients> { };

foreach (var client in clients)
{
    if(client.DateAdded.Date < DateTime.Today) {
        certainClients.Add(client);
    }
}

certainClients.Dump();

有两种选择。

首先。不使用匿名数据类型,而是使用 Clients 数据类型。实际上,您正在创建 Clients 对象 -

var clients = Clients.Where(c => c.FirstName.StartsWith("Mark"))
              .Select(c => new Clients{
                       LastName = c.LastName.ToUpper(),
                       c.DateAdded,
                       c.FirstName,
 })

第二。创建 object 的列表并为其分配任何 custom/anon 数据类型 -

var certainClients = new List<object> { };

最好的方法是投影到自定义业务实体 class。 这意味着我们实际上定义了 class 自己。例如。

 public class ClientEntity
    {
       public string LastName;
       public DateTime DateAdded;
        // etc for custom fields or properties you want
    }

然后我们可以简单地投影到我们定制的 class

var clients = Clients.Where(c => c.FirstName.StartsWith("Mark"))
              .Select(c => new ClientEntity{
                       LastName = c.LastName.ToUpper(),
                       DateAdded = c.DateAdded,
                       etc
 })

这样可以避免 List <object> 类型不安全并且不需要与原始客户端相似 class 例如,如果我们想要原始名称的长度。