Как действия LINQ могут быть выполнены на CollectionBase?

Я кодирую приложение форм C#, и у меня есть следующая коллекция для элемента управления PropertyGrid:

public class CustomWebpageJavaScriptFunctionCollection : CollectionBase, ICustomTypeDescriptor
{
    public void Add(CustomWebpageJavaScriptFunction obj)
    {
        this.List.Add(obj);
    }

    public void Remove(CustomWebpageJavaScriptFunction obj)
    {
        this.List.Remove(obj);
    }

    public CustomWebpageJavaScriptFunction this[int index]
    {
        get
        {
            return (CustomWebpageJavaScriptFunction)this.List[index];
        }
    }

    public String GetClassName()
    {
        return TypeDescriptor.GetClassName(this, true);
    }

    public AttributeCollection GetAttributes()
    {
        return TypeDescriptor.GetAttributes(this, true);
    }

    public String GetComponentName()
    {
        return TypeDescriptor.GetComponentName(this, true);
    }

    public TypeConverter GetConverter()
    {
        return TypeDescriptor.GetConverter(this, true);
    }

    public EventDescriptor GetDefaultEvent()
    {
        return TypeDescriptor.GetDefaultEvent(this, true);
    }

    public PropertyDescriptor GetDefaultProperty()
    {
        return TypeDescriptor.GetDefaultProperty(this, true);
    }

    public object GetEditor(Type editorBaseType)
    {
        return TypeDescriptor.GetEditor(this, editorBaseType, true);
    }

    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    {
        return TypeDescriptor.GetEvents(this, attributes, true);
    }

    public EventDescriptorCollection GetEvents()
    {
        return TypeDescriptor.GetEvents(this, true);
    }

    public object GetPropertyOwner(PropertyDescriptor pd)
    {
        return this;
    }


    /// <summary>
    /// Called to get the properties of this type. Returns properties with certain
    /// attributes. this restriction is not implemented here.
    /// </summary>
    /// <param name="attributes"></param>
    /// <returns></returns>
    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        return GetProperties();
    }

    /// <summary>
    /// Called to get the properties of this type.
    /// </summary>
    /// <returns></returns>
    public PropertyDescriptorCollection GetProperties()
    {
        // Create a collection object to hold property descriptors
        PropertyDescriptorCollection pds = new PropertyDescriptorCollection(null);

        // Iterate the list of employees
        for (int i = 0; i < this.List.Count; i++)
        {
            // Create a property descriptor for the employee item and add to the property descriptor collection
            CustomWebpageJavaScriptFunctionCollectionPropertyDescriptor pd = new CustomWebpageJavaScriptFunctionCollectionPropertyDescriptor(this, i);
            pds.Add(pd);
        }
        // return the property descriptor collection
        return pds;
    }
}

Как наилучшим образом выполнить запросы LINQ для вышеуказанной коллекции?

Например, как я могу выполнить действие.Where() над содержимым списка CollectionBase?

1 ответ

Решение

LINQ требует обобщенных перечислимых, CollectionBase не является общим. Попробуй сделать OfType<object>() Сначала вы можете использовать LINQ на IEnumerable<object> пример.

Изменить: как отмечено в комментариях, вы также можете использовать Cast<object>(), Разница между этими двумя методами заключается в том, что OfType будет включать элементы, которые можно привести к указанному типу в перечислении, и пропустить остальные, пока Cast требует, чтобы все элементы могли быть приведены к типу (в противном случае выдается исключение). Cast быстрее, так как он пропускает проверку и выполняет приведение сразу.

Cast источник итератора:

foreach (object obj in source) yield return (TResult)obj;

OfType источник итератора:

foreach (object obj in source) {
    if (obj is TResult) yield return (TResult)obj;
}
Другие вопросы по тегам