ver 1.3.0.3 / ちょっとした拡張メソッド群
- 2009-07-16
Gears of War 2やCall of Duty : World at Warでステータスが取得出来なかった件を修正しました。GoW2は修正を確認出来ましたがCoD:WaWは持ってないので分からない。多分直ってると思うけど。あと、この修正の影響で他がダメになる可能性がなくもないです。ダメっぽいのを発見したら即直す、という方向で暴走さえしなければある程度はいっかー、的にゆるふわ気分でいるのですがダメでしょうかダメですね。
ところで、int.Parseが多くなって結構面倒くさいので文字列に拡張メソッド。
public static int ToInt(this string value)
{
return int.Parse(value);
}
public static int ToIntOrDefault(this string value)
{
int result;
int.TryParse(value, out result);
return result;
}
public static string Remove(this string input, string pattern)
{
return Regex.Replace(input, pattern, "");
}
public static Match Match(this string input, string pattern)
{
return Regex.Match(input, pattern);
}
public static string Replace(this string input, string pattern, MatchEvaluator evaluator)
{
return Regex.Replace(input, pattern, evaluator);
}
RemoveとReplaceは既存のメソッド名のものに足してるので、別の名前のほうが良いかしらん。あと、Replaceは引数が被るので、ただの文字列置換は用意できなかった。まあ、_ => "hogehoge" といった具合に「_ => 」が増えるだけならそう手間でもないような十二分に手間のような。
totalGamerScore = document
.Descendants("div")
.First(e => e.GetAttribute("className") == "XbcProfileSubHead")
.Descendants("strong")
.Last()
.InnerText
.Match(@":\s*(\d+)/")
.Groups[1]
.Value
.ToInt();
こんな風に書けます。これでスクレイピングも快適ー。ドット繋げまくれてバンザイしちゃう。ただまあ、デバッグはし辛いですね。ログ吐くメソッドを仕込んだりもいいんですが、もっと単純に、ラムダ式挟めばデバッガで止められるので
public static class Ext
{
public static TResult Tap<T, TResult>(this T self, Func<T, TResult> func)
{
return func(self);
}
public static T Tap<T>(this T self, Action<T> action)
{
action(self);
return self;
}
}
RubyのTapみたいな、ということで。
ダミー置いて、その場で止められるようになる。それで作って、出来あがったらTapの行をCtrl+Xでゴミ箱ぽい。IEnumerableの場合は、普通にダミーのSelect置けばいいだけでしたね! 今、そのことに気付いた。うーん、あと.Groups.Cast<Group>().Skip(1).Select(g => g.Value) も、頻繁にあるあるなので、Matchに拡張メソッド埋めときますか。