将 LINQ 与实现非泛型 ICollection 的类结合使用
我想针对 MatchCollection
对象运行 LINQ 查询,但发现这是不可能的,因为它没有实现 ICollection
,而只是实现 ICollection
代码>.
在代码简洁性以及性能和内存使用方面,将 LINQ 与非泛型集合结合使用的最佳选择是什么?
(如果有兴趣,这里是非 LINQuified 代码:)
MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
foreach (Match m in fieldValues)
{
if (m.Groups["text"].Value.Equals(someString))
{
// Do stuff
}
}
I wanted to run a LINQ query against a MatchCollection
object but found this wasn't possible as it doesn't implement ICollection<T>
, just ICollection
.
What is the best option for using LINQ with non-generic collections, both in terms of code conciseness but also performance and memory usage?
(If interested, here is the non-LINQuified code:)
MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
foreach (Match m in fieldValues)
{
if (m.Groups["text"].Value.Equals(someString))
{
// Do stuff
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您也可以将
someString
过滤器包含在 LINQ 中。请注意,编译器将这样的查询转换为这样...
...
因此,同时包含类型和
Cast()
是多余的。在性能方面,
Cast()
只是执行显式类型转换并生成值,因此性能影响可以忽略不计。 对于您不确定所有成员都属于所需类型的旧集合,您可以改用OfType()
。You can include your
someString
filter with LINQ as well.Note that the compiler translates a query like this...
...into this...
...so including both the type and
Cast<T>()
is redundant.Performance-wise,
Cast<T>()
just does an explicit type cast and yields the value, so the performance hit will be negligible. For legacy collections where you're not sure all members are of the desired type, you can useOfType<T>()
instead.尝试使用 Cast 扩展方法,它将返回 IEnumerable。
如果您不使用 Cast 方法,编译器会将“查询”的类型推断为 IEnumerable。
Try to use the Cast extension method which will return an IEnumerable.
And event if you don't use the Cast method the compiler will infer the type of "query" to IEnumerable.