IEqualityComparer ラムダ式で実装

Dictionry.Constantsでラムダ受け付けてほしい
IEqualityComparerとかめんどい - Memo+を拡張メソッドに改変

/// <summary>
/// ラムダ式を受け付けるIEqualityComparerの実装を提供します。
/// </summary>
/// <typeparam name="T">比較するオブジェクトの型。</typeparam>
static public class LambdaComparer {

	/// <summary>
	/// 既定の等値比較子を使用して、指定した要素がシーケンスに含まれているかどうかを判断します。
	/// </summary>
	/// <typeparam name="T"></typeparam>
	/// <param name="source">値の検索対象となるシーケンス。</param>
	/// <param name="value">シーケンス内で検索する値。</param>
	/// <param name="lambdaComparer">比較を行うためのラムダ式。</param>
	/// <returns>指定した値を持つ要素がソース シーケンスに含まれている場合は true。それ以外は false。</returns>
	public static bool ContainsLamda<T>( this IEnumerable<T> source, T value, Func<T, T, bool> lambdaComparer ) {
		return source.Contains( value, new LambdaComparerInstance<T>( lambdaComparer ) );
	}
}

class LambdaComparerInstance<T> : EqualityComparer<T> {
	private readonly Func<T, T, bool> _lambdaComparer;
	private readonly Func<T, int> _lambdaHash;

	/// <summary>
	/// LambdaComparer<T> クラスの新しいインスタンスを初期化します。
	/// </summary>
	/// <param name="lambdaComparer"></param>
	public LambdaComparerInstance( Func<T, T, bool> lambdaComparer ) :
		this( lambdaComparer, o => 0 ) {
	}

	/// <summary>
	/// LambdaComparer<T> クラスの新しいインスタンスを初期化します。
	/// </summary>
	/// <param name="lambdaComparer">比較用のラムダ式。</param>
	/// <param name="lambdaHash">ハッシュ用のラムダ式。</param>
	public LambdaComparerInstance( Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash ) {
		if ( lambdaComparer == null ) {
			throw new ArgumentNullException( "lambdaComparer" );
		}
		if ( lambdaHash == null ) {
			throw new ArgumentNullException( "lambdaHash" );
		}
		_lambdaComparer = lambdaComparer;
		_lambdaHash = lambdaHash;
	}

	/// <summary>
	/// T 型の 2 つのオブジェクトが等しいかどうかを確認します。
	/// </summary>
	/// <param name="x">比較対象の第 1 オブジェクト。</param>
	/// <param name="y">比較対象の第 2 オブジェクト。</param>
	/// <returns>指定したオブジェクトが等しい場合は true。それ以外の場合は false。</returns>
	public override bool Equals( T x, T y ) {
		return _lambdaComparer( x, y );
	}

	/// <summary>
	/// ハッシュ アルゴリズムや、ハッシュ テーブルなどのデータ構造体の指定したオブジェクトに使用するハッシュ関数として機能します。
	/// </summary>
	/// <param name="obj">ハッシュ コードを取得する対象となるオブジェクト。</param>
	/// <returns>指定したオブジェクトのハッシュ コード。</returns>
	public override int GetHashCode( T obj ) {
		return _lambdaHash( obj );
	}
}

usage

Dictionary<int, string> dic;

dic.Values.ContainsLamda( "aa", ( a, b ) => { return a == b; } );

JAVAの日付に変換

JSTのみ?

private static readonly DateTime ORIGIN = new DateTime( 1970, 1, 1, 9, 0, 0, 0 );
private static DateTime JavaDateToDateTime( long javaDateTime ) {
	return new DateTime( ( javaDateTime ) * 10000 + ORIGIN.Ticks );
}

private static long DateTimeToJavaDate( DateTime dateTime ) {
	return ( dateTime - ORIGIN ).Ticks / 10000;
}

オレオレ証明書回避

認証局信頼されていない自己証明書では↓の例外が出る

SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした ---> System.Security.Authentication.AuthenticationException: 検証プロシージャによると、リモート証明書は無効です。

対応:ServicePointManager.ServerCertificateValidationCallbackが呼ばれるのでtrueを返す。

ServicePointManager.ServerCertificateValidationCallback
    = ( sender, certificate, chain, sslPolicyErrors ) => { return true; };

クライアントからアップロード

	/// <summary>
	/// ファイルをアップロードする
	/// </summary>
	class FileUploader {
		string _uploadUrl;
		string _postInputName;
		Encoding _encode;
		CookieContainer _cookies;

		/// <summary>
		/// 文字コード、アップロードのアクションを指定してImageUploaderのインスタンスを初期化します。
		/// </summary>
		/// <param name="uploadUrl">アップロード用URL</param>
		/// <param name="encode">使用エンコード</param>
		/// <param name="cookies">利用するcookie</param>
		/// <param name="postInputName">アップロードアクション名</param>
		public FileUploader( string uploadUrl, Encoding encode, CookieContainer cookies = null, string postInputName = "upload" ) {
			_uploadUrl = uploadUrl;
			_encode = encode;
			_cookies = cookies;
			_postInputName = postInputName;
		}

		/// <summary>
		/// 文字コードをUTF-8としてImageUploaderのインスタンスを初期化します。
		/// </summary>
		/// <param name="uploadUrl">アップロード用URL</param>
		/// <param name="cookies">利用するcookie</param>
		public FileUploader( string uploadUrl, CookieContainer cookies = null ) {
			_uploadUrl = uploadUrl;
			_encode = Encoding.UTF8;
			_cookies = cookies;
		}

		/// <summary>
		/// 指定されたURLに対してMemoryStreamの内容をpoutする。
		/// </summary>
		/// <param name="memoryStream">アップロードデータ</param>
		/// <param name="fileName">アップロードファイル名</param>
		/// <returns>サーバーからの応答</returns>
		public string PostMemoryImage( MemoryStream memoryStream, string fileName ) {
			string boundary = GetBoundary();

			var request = (HttpWebRequest)WebRequest.Create( _uploadUrl );

			request.Method = "POST";
			request.ContentType = "multipart/form-data; boundary=" + boundary;
			request.CookieContainer = _cookies;

			var header = CreateHeader( fileName, boundary );
			var closeDelimiter = _encode.GetBytes( "\r\n--" + boundary + "--\r\n" );

			request.ContentLength = header.Length + memoryStream.Length + closeDelimiter.Length;

			SendData( request, header, memoryStream, closeDelimiter );

			var res = (HttpWebResponse)request.GetResponse();
			using ( var resStream = res.GetResponseStream() ) {
				using ( var reader = new StreamReader( resStream, _encode ) ) {
					return reader.ReadToEnd();
				}
			}
		}

		/// <summary>
		/// 区切り文字作成
		/// </summary>
		private static string GetBoundary() {
			var guidValue = Guid.NewGuid();
			string boundary = guidValue.ToString( "N" );
			return boundary;
		}

		/// <summary>
		/// アップロードするデータを送信する。
		/// </summary>
		/// <param name="request">送信リクエスト</param>
		/// <param name="header">multipartヘッダ</param>
		/// <param name="memoryStream">アップロードデータ</param>
		/// <param name="closeDelimiter">終端データ</param>
		private static void SendData( HttpWebRequest request, byte[] header, MemoryStream memoryStream, byte[] closeDelimiter ) {
			using ( var reqStream = request.GetRequestStream() ) {
				reqStream.Write( header, 0, header.Length );

				byte[] readData = new byte[0x1000];
				int maxCount = (int)( memoryStream.Length / readData.Length ) + 1;
				int readCount = 0;
				memoryStream.Position = 0;
				while ( readCount < maxCount ) {
					memoryStream.Read( readData, 0, readData.Length );
					reqStream.Write( readData, 0, GetNextReadSize( memoryStream, readData, readCount ) );
					readCount++;
				}

				reqStream.Write( closeDelimiter, 0, closeDelimiter.Length );
			}
		}

		private static int GetNextReadSize( MemoryStream memoryStream, byte[] readData, int readCount ) {
			return (int)Math.Min( readData.Length, memoryStream.Length - ( readCount * readData.Length ) );
		}

		/// <summary>
		/// multipart用ヘッダを作成する。
		/// </summary>
		/// <param name="fileName">アップロードファイル名</param>
		/// <param name="boundary">境界文字列</param>
		/// <returns>作成されたmultipart用ヘッダ</returns>
		private byte[] CreateHeader( string fileName, string boundary ) {
			var multipartHead = new StringBuilder();
			multipartHead.AppendFormat( "--{0}\r\n", boundary );
			multipartHead.AppendFormat( "{0}:{1}\r\n", "Content-Disposition"
				, string.Format( "form-data; name=\"{0}\"; filename=\"{1}\"", _postInputName, fileName )
			);
			multipartHead.AppendFormat( "{0}:{1}\r\n", "Content-Type", "application/octet-stream" );
			multipartHead.AppendFormat( "{0}:{1}\r\n", "Content-Transfer-Encoding", "binary" );
			multipartHead.Append( "\r\n" );

			return _encode.GetBytes( multipartHead.ToString() );
		}
	}

	/// <summary>
	/// 画像ファイルをアップロードする
	/// </summary>
	class ImageUploader : FileUploader {

		public ImageFormat ImageFormat { get; set; }

		/// <summary>
		/// 文字コード、アップロードのアクションを指定してImageUploaderのインスタンスを初期化します。
		/// </summary>
		/// <param name="uploadUrl">アップロード用URL</param>
		/// <param name="encode">使用エンコード</param>
		/// <param name="cookies">利用するcookie</param>
		/// <param name="postInputName">アップロードアクション名</param>
		public ImageUploader( string uploadUrl, Encoding encode, CookieContainer cookies = null, string postInputName = "upload" )
			: base( uploadUrl, encode, cookies, postInputName ) {
		}

		/// <summary>
		/// 文字コードをUTF-8としてImageUploaderのインスタンスを初期化します。
		/// </summary>
		/// <param name="uploadUrl">アップロード用URL</param>
		/// <param name="cookies">利用するcookie</param>
		public ImageUploader( string uploadUrl, CookieContainer cookies = null )
			: base( uploadUrl, cookies ) {
		}

		/// <summary>
		/// 画像のアップロードを行う。
		/// </summary>
		/// <param name="image">対象画像</param>
		public string UploadImage( Image image ) {
			using ( var memoryStream = new MemoryStream() ) {
				FillPngData( image, memoryStream );
				return PostMemoryImage( memoryStream, NameingImageFile() );
			}
		}

		private void FillPngData( Image image, MemoryStream memoryStream ) {
			image.Save( memoryStream, ImageFormat == null ? image.RawFormat : ImageFormat );
		}

		private string NameingImageFile() {
			return DateTime.Now.ToString( "yyyyMMddHHmmssfff" ) + GetExtention();
		}

		string GetExtention() {
			if ( ImageFormat == ImageFormat.Png ) {
				return ".png";
			}
			if ( ImageFormat == ImageFormat.Jpeg ) {
				return ".jpg";
			}
			return "";
		}
	}