2017/01/24

C#のラムダのソートで全半角や大文字小文字を無視する

C#のラムダのソートで全半角や大文字小文字を無視する
C#のラムダ式での並び替えをする場合、単純な並び替えをして ToList() するのであれば OrderBy や OrderByDescending 等で事足ります。ただ、日本語環境にありがちな大文字や小文字、全角や半角を無視しての並び替えなど、細かい条件をつけた並び替えは、String.Compare メソッドを使用する必要があります。

大文字や小文字、全角や半角も無視して並び替える例

var lst = new List() 
{ 
    new Product {Name = "CCC",Amount = 1000, }, 
    new Product {Name = "aaaa",Amount = 2000, }, 
    new Product {Name = "ZZZ",Amount = 3000, }, 
    new Product {Name = "BBBB",Amount = 5000, }, 
}; 
 
// 昇順(日本語のロケーションではこれだけでいけます) 
lst.Sort((x, y) => string.Compare(x.Name, y.Name)); 
// 降順 
lst.Sort((x, y) => string.Compare(y.Name, x.Name)); 
 
// 明示的にオプションを付ける場合 
lst.Sort((x, y) => string.Compare(x.Name, y.Name, true)); 
// カルチャ情報を「日本」に指定 
lst.Sort((x, y) => string.Compare(x.Name, y.Name, true, new CultureInfo("ja-JP"))); 
大文字と小文字に関しては、ToUpper() や ToLower() などを使って揃えてから行う書き方をする人もいますが、これらは Compare メソッドと比較すると 2 倍の速度差があるようです。

大文字/小文字を区別しないで文字列を比較するには?[C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/624ignorecase/ignorecase.html

ToUpper や ToLower は、文字列の整形のために使用するに留めておいた方が良いですね。

2017/01/23

C#のbyteをintに変換する

C#のbyteをintに変換する
C#の byte って、妙な動きをしますよね。

C#におけるbyteの足し算

// 代入した時点で、暗黙的に int から byte へ変換されている。 
byte b = 1; 
byte c = 10; 
 
// 演算は int で行われるため、明示的に型変換を行う必要がある。 
byte sum = (byte)(b + c); 
byte は 255 までしか入りません。
なので、以下のようには書けません。コンパイルエラーとなります。
byte b = 258; 
面白いのがこれ。
byte b = 255; 
byte c = 255; 
 
// 254 
byte sum = (byte)(b + c); 
実行時にエラーにもならず、なぜか 254 が返ってきます。
byteを計算するとかあまりないケースですが、扱う際にはちょっと注意が必要です。

byte (C# リファレンス)
https://msdn.microsoft.com/ja-jp/library/5bdb6693.aspx

2017/01/21

C#でCharをIntに変換する際は注意

C#でCharをIntに変換する際は注意
C# で Char を Int に変換する時は注意が必要です。

バグを生みやすいcharの変換

文字列を先頭からチェックしたい場合などに多用する String.Chars プロパティ。
https://msdn.microsoft.com/ja-jp/library/system.string.chars(v=vs.110).aspx

これは使い勝手がなかなか良いのですが、名前のとおり Char で返ってきます。
返ってきた Char は数値に変換して比較なんかする場合が多いと思いますが…
var number = "12345"; 
// 49 
var firstNumber1 = Convert.ToInt32(number[0]); 
// 1 
var firstNumber2 = Convert.ToInt32(number[0].ToString()); 
ToString() していない場合は、10 進数の ASCII コードが返ってきます。

ASCII文字コード
http://e-words.jp/p/r-ascii.html

ビルドエラーになるわけではないので、きちんとした単体テストを作っておくか、実際に動かして検証する必要がありますね。

2017/01/19

Chromeでショートカットキーからタブを複製するにはAlt+D&Alt+Enterで

ショートカットキーからタブを複製する
Google Chrome には、「タブの複製」 というショートカットキーは残念ながらありません。しかし、Alt + D と Alt + Enter という合せ技でタブを複製することができます。

ショートカットキーからタブを複製する
Alt + D でアドレスバーにフォーカスを移します。

ショートカットキーからタブを複製する
その状態で、Alt + Enter を押下すると、タブが複製されます。
Alt キーを押しっぱなしにして、D, Enter を覚えると瞬時に複製することができます。

どうしても一つの手順だけで複製したいんだ!
という場合は、こんな拡張機能もあります。

Duplicate Tab Shortcut Key

2017/01/18

C#で文字列内の空白を削除する

C#で文字列内の空白を削除す
文字列の中にある空白を削除したい場合があります。
この場合、空白を別文字に置換する、ということで Replace を使用しますが、日本語環境の場合は半角と全角があるため注意が必要です。
var s1 = " おお! しんでしまうとは なにごとだ! "; 
// "おお!しんでしまうとはなにごとだ!" 
s1 = s1.Replace(" ","").Replace(" ",""); 
 
// 正規表現の場合 
s1 = Regex.Replace(s1, @"\s", ""); 

なお、Trim() は前後の空白のみ除去します。
これは全角と半角、いずれのスペースも削除してくれます。
Related Posts Plugin for WordPress, Blogger...