guh*_*hou 7 c# generics linq-to-objects
我最近一直在教自己LINQ并将它应用于各种小谜题.但是,我遇到的一个问题是LINQ-to-objects只适用于泛型集合.是否有将非泛型集合转换为泛型集合的秘密技巧/最佳实践?
我当前的实现将非泛型集合复制到一个数组然后操作,但我想知道是否有更好的方法?
public static int maxSequence(string str)
{
MatchCollection matches = Regex.Matches(str, "H+|T+");
Match[] matchArr = new Match[matches.Count];
matches.CopyTo(matchArr, 0);
return matchArr
.Select(match => match.Value.Length)
.OrderByDescending(len => len)
.First();
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
最简单的方法通常是Cast扩展方法:
IEnumerable<Match> strongMatches = matches.Cast<Match>();
Run Code Online (Sandbox Code Playgroud)
请注意,这是延迟并流式传输其数据,因此您没有这样的完整"集合" - 但它是LINQ查询的完美数据源.
Cast 如果在查询表达式中指定范围变量的类型,则会自动调用:
所以要完全转换你的查询:
public static int MaxSequence(string str)
{
return (from Match match in Regex.Matches(str, "H+|T+")
select match.Value.Length into matchLength
orderby matchLength descending
select matchLength).First();
}
Run Code Online (Sandbox Code Playgroud)
要么
public static int MaxSequence(string str)
{
MatchCollection matches = Regex.Matches(str, "H+|T+");
return matches.Cast<Match>()
.Select(match => match.Value.Length)
.OrderByDescending(len => len)
.First();
}
Run Code Online (Sandbox Code Playgroud)
事实上,你不需要调用OrderByDescending然后First在这里 - 你只需要最大值,该Max方法可以获得.更好的是,它允许您指定从源元素类型到您尝试查找的值的投影,因此您可以不用这样做Select:
public static int MaxSequence(string str)
{
MatchCollection matches = Regex.Matches(str, "H+|T+");
return matches.Cast<Match>()
.Max(match => match.Value.Length);
}
Run Code Online (Sandbox Code Playgroud)
如果您的集合中包含一些正确类型的元素,但某些元素可能不是,则可以使用OfType.Cast遇到"错误"类型的项时抛出异常; OfType只是跳过它.
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |