【问题标题】:C# Converting object to List<object>C# 将对象转换为 List<object>
【发布时间】:2017-07-04 05:41:50
【问题描述】:

我需要将字符串列表转换为对象列表,但问题是我将此列表作为对象接收,因为它是一个参数,我不知道它是什么类型。

这是接收参数的函数:

public static bool IsNotEmpty(object obj)
{
    if (obj is ICollection)
    {
        IList<object> collection = (IList<object>)obj; // The cast throws error here
        return IsNotEmpty(collection);
    }

    return true;
}

这就是这个人使用的:

public static bool IsNotEmpty<T>(IList<T> aList)
{
    return aList != null && aList.IsNotEmpty();
}

如何将它转换为对象列表,然后我可以将它传递给另一个函数? (如果有办法)

【问题讨论】:

  • 为什么要 IsNotEmptyString 采用对象而不是字符串?
  • IsNotEmptyString 是该函数的一个极具误导性的名称
  • 对不起,我改变了功能,所以我可以在这里显示它!现在它实际上正在转换为字符串列表。
  • 你为什么不使用aList.Count &gt;0It's in the interface.

标签: c# list ienumerable icollection


【解决方案1】:
    public static bool IsNotEmpty(object obj)
    {
        var collection = obj as ICollection;
        return collection == null || collection.Count > 0;
    }

【讨论】:

    【解决方案2】:

    您正在做我们所说的“XY 问题”:您为自己的问题考虑了一个(错误的)解决方案,并且您在询问您的错误解决方案,而不是为您的实际问题寻求解决方案。

    您不需要首先将字符串列表转换为对象列表,因此无需询问如何执行此操作。您的问题的正确解决方案是:

    static class MyExtensions 
    {
      public static bool Any(this IEnumerable sequence) 
      {
         if (sequence == null) 
           throw new ArgumentNullException ... etc ...
         if (sequence is ICollection)
           return ((ICollection)sequence).Any();
         foreach(object item in sequence)
           return true;
         return false;
       }
       public static bool Any(this ICollection collection)
       {
          if (collection == null) blah blah blah
          return collection.Count > 0;
       }
    }
    

    太好了。现在你的方法是:

    public static bool IsNotEmpty(object obj)
    {
      if (obj is IEnumerable)
        return ((IEnumerable)obj).Any();
      else
        return true; 
    }
    

    这里的想法是首先去收集,因为这样可以避免不必要地枚举序列。那可能很昂贵。但是,如果我们有一个包含项目但不是集合的序列,则枚举它的第一个元素。如果我们能成功地做到这一点,那么它就不是空的;如果我们不能,那么它是空的。

    但更一般地说:您的方法的签名是不幸的。如果可以避免的话,请不要陷入手头有object 的情况。你是怎么陷入这种境地的?

    【讨论】:

    • 最后一段是我认为最重要的。我真的很想知道为什么 OP 有一个 object 而不是一些类型的集合可以使用。我怀疑这才是真正应该解决这个问题的地方。
    • 如果使用 as - IsNotEmpty 会更短
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多