如何在 CollectionBase 上执行 LINQ 操作?
How can LINQ actions be performed on a 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 查询的最佳方法是什么?
例如,如何对 CollectionBase 列表的内容执行 .Where() 操作?
LINQ 需要泛型枚举,CollectionBase
是非泛型的。首先尝试执行 OfType<object>()
,然后您可以在 IEnumerable<object>
实例上使用 LINQ。
编辑:如评论中所述,您也可以使用 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;
}
我正在编写一个 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 查询的最佳方法是什么?
例如,如何对 CollectionBase 列表的内容执行 .Where() 操作?
LINQ 需要泛型枚举,CollectionBase
是非泛型的。首先尝试执行 OfType<object>()
,然后您可以在 IEnumerable<object>
实例上使用 LINQ。
编辑:如评论中所述,您也可以使用 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;
}