我有业务对象集合
我想使用linq过滤行,但注意到它返回IEnumerable,然后无法转换到我的BOC
E.g我不能那样做
BOC <Client> bocCLients = (BOC <Client>)
from C in ClientsColl where C.ClientId == 100 select C
我已经通过循环linq结果并将返回的对象添加到我的原始集合中来解决这个问题。
我想知道是否有更简单的方法?
答案 0 :(得分:1)
var bocCLients = ClientsColl.Where(c => c.ClientId == 100).ToList();
或者
var bocCLients = new BOC<Client>(ClientsColl.Where(c => c.ClientId == 100));
修改强> 或者也许是AddRange扩展
public static void AddRange<T>(this ICollection<T> colSource, IEnumerable<T> collection)
{
if (colSource is List<T>)
((List<T>)colSource).AddRange(collection); //If List use build in optimized AddRange function
else
{
foreach (var item in collection)
colSource.Add(item);
}
}
答案 1 :(得分:1)
这看起来是创建扩展方法的绝佳机会。通过查看您的问题,看起来ClientsColl已经包含Client类型的对象。在这种情况下,您的foreach循环解决方案是理想的。但是,您可以将该解决方案封装到扩展方法中,并使其可重用且易于阅读。
以下是一个示例:
public static BOC<T> ToBOC<T>(this IEnumerable<T> sourceCollection)
{
var boc = new BOC<T>();
foreach (T item in sourceCollection)
{
boc.Add(item);
}
return boc;
}
使用此扩展方法,您只需按如下方式编写查询:
BOC<Client> bocClients =
(
from C in ClientsColl
where C.ClientID == 100
select C
).ToBOC();
修改强>:
跟进更通用的扩展方法到ICollection的想法,但保持原来的问题是执行一种Cast到特定类型的集合,现在拥有BOC实现ICollection的新信息,这是一个更通用的扩展方法和用于执行作业的用法:
public static TCollection ToICollection<T, TCollection>(this IEnumerable<T> sourceCollection)
where TCollection : ICollection<T>, new()
{
TCollection col = new TCollection();
foreach (T item in sourceCollection)
{
col.Add(item);
}
return col;
}
用法:
BOC<Client> bocClients2 =
(
from C in ClientsColl
where C.ClientID == 100
select C
).ToICollection<Client, BOC<Client>>();
这看起来更有用吗?让我知道你的想法。