gpt4 book ai didi

c# - 将 IEnumerable 转换为用户类型的更好方法

转载 作者:可可西里 更新时间:2023-11-01 09:09:00 26 4
gpt4 key购买 nike

我有一个自定义集合类型,定义如下:

public abstract class RigCollectionBase<T> : Collection<T>, IEnumerable<T>, INotifyPropertyChanged, IBindingList, ICancelAddNew where T : BusinessObjectBase, new()

注意:这是基类,有20个左右的子类是这样实现的:

public class MyCollection : RigCollectionBase<MyObject>

我们在代码中使用了很多 Linq,您可能知道,Linq 函数返回 IEnumerable<T> .我正在寻找的是返回到 MyCollection 的简单方法。来自 IEumberable<MyObject> .不允许转换,我收到异常“无法从...转换”

这是我想出的答案,它确实有效,但它看起来有点笨拙而且...过于复杂。也许不是,但我想我会把它拿出来看看是否有更好的方法。

public static class Extension
{
/// <summary>
/// Turn your IEnumerable into a RigCollection
/// </summary>
/// <typeparam name="T">The Collection type</typeparam>
/// <typeparam name="U">The Type of the object in the collection</typeparam>
/// <param name="col"></param>
/// <returns></returns>
public static T MakeRigCollection<T, U> (this IEnumerable<U> col) where T : RigCollectionBase<U>, new() where U : BusinessObjectBase, new()
{
T retCol = new T();

foreach (U myObj in col)
retCol.Add(myObj);

return retCol;
}
}

我想,我真正想要的是这个。有没有一种方法可以实现基类,以便我可以使用简单的强制转换从 IEnumerable 转到 MyCollection...

var LinqResult = oldCol.Where(a=> someCondition);
MyCollection newCol = (MyCollection)LinqResult;

不,上面的代码不起作用,实际上我不能 100% 确定为什么会这样……但事实并非如此。感觉好像有一些非常明显的步骤我没有看到....

最佳答案

您的方法 MakeRigCollection 基本上是正确的方法。这是一个使用起来稍微冗长但实现起来更简单的变体:

TCollection MakeRigCollectionSimple<TCollection, TItem>(
this IEnumerable<TItem> items, TCollection collection)
where TCollection : ICollection<TItem>
{
foreach (var myObj in items)
collection.Add(myObj);
return collection;
}

希望我做对了。你可以这样使用它:

MakeRigCollectionSimple(items, new MyCollection());

items.MakeRigCollectionSimple(new MyCollection());

现在您需要填写第二个参数,但作为交换,我们能够摆脱所有疯狂的泛型。只剩下简单的泛型。并且类型推断完全开始。此外,这将适用于所有 集合类型,而不仅仅是您的 RigCollections。

关于c# - 将 IEnumerable<T> 转换为用户类型的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15787953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com