将 LINQ 与实现非泛型 ICollection 的类结合使用

发布于 2024-07-26 15:38:30 字数 483 浏览 13 评论 0原文

我想针对 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

舟遥客 2024-08-02 15:38:30

您也可以将 someString 过滤器包含在 LINQ 中。

var matches = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
var textMatches = from Match m in matches
                  where m.Groups["text"].Value.Equals(someString)
                  select m;

foreach (Match m in textMatches)
{
    // Do stuff
}

请注意,编译器将这样的查询转换为这样...

var q = from MyType x in myEnum select x;

...

var q = from x in myEnum.Cast<MyType>() select x;

因此,同时包含类型和 Cast() 是多余的。

在性能方面,Cast() 只是执行显式类型转换并生成值,因此性能影响可以忽略不计。 对于您不确定所有成员都属于所需类型的旧集合,您可以改用 OfType()

You can include your someString filter with LINQ as well.

var matches = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
var textMatches = from Match m in matches
                  where m.Groups["text"].Value.Equals(someString)
                  select m;

foreach (Match m in textMatches)
{
    // Do stuff
}

Note that the compiler translates a query like this...

var q = from MyType x in myEnum select x;

...into this...

var q = from x in myEnum.Cast<MyType>() select x;

...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 use OfType<T>() instead.

旧城烟雨 2024-08-02 15:38:30

尝试使用 Cast 扩展方法,它将返回 IEnumerable。

IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
                           select m;

如果您不使用 Cast 方法,编译器会将“查询”的类型推断为 IEnumerable。

  var query = from Match v in fieldValues
                        select v;

Try to use the Cast extension method which will return an IEnumerable.

IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
                           select m;

And event if you don't use the Cast method the compiler will infer the type of "query" to IEnumerable.

  var query = from Match v in fieldValues
                        select v;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文