【问题标题】:Return a List<SomeObject> without a certain property using Linq in c#?在 c# 中使用 Linq 返回没有特定属性的 List<SomeObject>?
【发布时间】:2014-10-29 20:39:33
【问题描述】:

我有一个包含不同属性的对象,如下所示:

 public class CompressedLogResponse
 {
    public string LoggerType { get; set; }
    public int NumberOfRegisters { get; set; }
    public int NewLogId { get; set; }
    public DateTime LoggerAnnounceTime { get; set; }
    public List<Log> Log{ get; set; }
 }

如何返回不包含List&lt;Log&gt; Log 属性的对象列表?

Linq 是首选

感谢您提供的任何帮助

【问题讨论】:

  • 这个类的所有对象都有这个属性。您是指具有 null 或空 Log 列表的那些吗?
  • 仅使用 Linq 您正在查看 .Select()
  • 如果没有 Log 属性,您将无法返回 CompressedLogResponse 列表。不过,您可以返回没有该属性的匿名类型。
  • “不包括”是什么意思?
  • 通过“不包括”,我了解除 List 之外的所有属性。通过使用原始列表,并使用它创建一个匿名类型列表并删除不需要的属性 - 我认为 OP 会得到想要的结果。

标签: c# linq


【解决方案1】:

你不能仅仅隐藏一个类的属性(你将它声明为公共的)

选项 1: 尽管正如 Robson 所写,您可以将其设置为 null(这不是很可靠的想法,因为没有人希望类包含始终为 null 的属性)

选项2: 如果您在同一个地方使用该类,请使用 Mez 所写的匿名类型,尽管听起来您想隐藏该属性以防止外部使用。 (我不喜欢动态方法,动态关键字是为 interop/DOM 而不是用于传输匿名类型。)

选项3: 如果您希望返回这种类型的 List 而不需要 Log 属性,则必须创建一个新类(继承是实现这一点的好方法):

public class CompressedLogResponseBase
{
    public string LoggerType { get; set; }
    public int NumberOfRegisters { get; set; }
    public int NewLogId { get; set; }
    public DateTime LoggerAnnounceTime { get; set; }
}

public class CompressedLogResponse : CompressedLogResponseBase
{
    public List<Log> Log{ get; set; }
}

现在您可以返回基本项目列表(根本没有 Log 属性)

public List<CompressedLogResponseBase> ReturnWithoutLog(IEnumerable<CompressedLogResponse> items)
{
    return ((IEnumerable<CompressedLogResponseBase>)items).ToList();
}

如果一个 IEnumerable 作为返回类型是足够的,它变得非常容易

public IEnumerable<CompressedLogResponseBase> ReturnWithoutLog(IEnumerable<CompressedLogResponse> items)
{
    return items
}

【讨论】:

    【解决方案2】:

    “不包括列表日志属性”我猜你的意思是属性“公共列表日志”将被空白但仍然存在,因此您可以将该属性设为空,因为如果您创建的对象不t 包含“public List Log”属性,而不是“CompressedLogResponse”,而是另一种类型。

    List<CompressedLogResponse> listOne = new List<CompressedLogResponse>();
    //....
    //fill the listOne
    //....
    List<CompressedLogResponse> listWithoutListLog = (from item in listOne
                                          select new CompressedLogResponse(
                                                LoggerType = item.LoggerType,
                                                NumberOfRegisters = item.NumberOfRegisters ,
                                                NewLogId = item.NewLogId ,
                                                LoggerAnnounceTime = item.LoggerAnnounceTime ,
                                                Log= null)).ToList();
    

    【讨论】:

      【解决方案3】:

      您可以返回原始列表的匿名列表,如下所示;

      public static List<dynamic>   Test() {
      
                  List<CompressedLogResponse> list = new List<CompressedLogResponse>();
      
                  var result = list.Select(x => new
                  { 
                      x.LoggerAnnounceTime,
                      x.LoggerType,
                      x.NewLogId,
                      x.NumberOfRegisters
                  });
      
                  return result.ToList<dynamic>();
              }
      

      看看.Select(),还有dynamic关键字。

      然后调用它,

      var x =  Test();
             foreach(dynamic o in x)
             {
                 int NumberOfRegisters;
      
                 //You have 2 ways... either by
                 NumberOfRegisters = o.NumberOfRegisters;
      
                 // or reflection
                 NumberOfRegisters = o.GetType().GetProperty("NumberOfRegisters").GetValue(o, null);
      
             }
      

      【讨论】:

      • 如果您需要将result 返回给调用者,因为列表中的类型是匿名的,这将不起作用。
      • 如果要在当前上下文之外使用 OP,我们没有足够的信息。我们所知道的是 List 不是必需的,我们更喜欢使用 Linq。
      • 您正在谈论返回列表。也许你在谈论的是,选择一个匿名列表。无法返回匿名类型。
      • 为什么投反对票? @Dom84 是的,我更新了答案。
      • 为什么我不想在那种情况下使用动态?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2022-01-01
      相关资源
      最近更新 更多