投稿

ラベル(LINQ)が付いた投稿を表示しています

LINQでBufferしたい

Observable.BufferをLINQで実現する var arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; /* GroupByを使う */ IEnumerable<IEnumerable<int>> arr2 = arr.Select((value, index) => (value, index)).GroupBy(a => a.index / 3).Select(a => a.Select(b => b.value)); // [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] /* Aggregateを使う */ List<List<int>> arr3 = arr.Aggregate(new List<List<byte>>(), (list, next) => { if (!list.Any() || list.Last().Count() >= 3) list.Add(new List<byte>()); list.Last().Add(next); return list; }); // [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] /* Observable.Bufferを使う */ IList<IList<int>> arr4 = await arr.ToObservable().Buffer(3).ToList().ToTask(); // [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

C#標準ライブラリでWebSocketクライアントを作る

C#でWebSocketクライアントを作りたい場合、websocket-sharpというライブラリがよく使われているが、標準ライブラリだけで賄いたい。 標準でSystem.Net.WebSockets名前空間にClientWebSocketクラスが用意されており、MSDNに使い方が載っている。 Windows 8 のネットワーク接続 - Windows 8 と WebSocket プロトコル 一応通信はできるのだが、あまりにも原始的なのでラッパークラスを作る。 using System; using System.IO; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; public class WebSocketClient { private const int SendBufferSize = 1024; private const int ReceiveBufferSize = 1024; private ClientWebSocket Socket; public event EventHandler OnOpenHandler; public event EventHandler OnCloseHandler; public event EventHandler<string> OnTextHandler; public event EventHandler<byte[]> OnBinaryHandler; public Uri Uri { get; set; } public async Task SendTextAsync(string text) { using var memoryStream = new MemoryStream(); using var streamWriter = new StreamWriter(memoryStream); await streamWriter.WriteAsync(text); await st...