tag:blogger.com,1999:blog-84518640713778978312024-02-19T13:06:02.136+04:00T is TT is T: c# helpful tipsUnknownnoreply@blogger.comBlogger14125tag:blogger.com,1999:blog-8451864071377897831.post-82640405187349749682019-07-19T13:40:00.001+04:002019-07-19T13:40:15.947+04:00Intervals 2.0Updated intervals combining (splicing/clipping) method with the new features of C# 7.0. Intervals passed can overlap.<br />
Two weird classes added for convenience. <b>Pair<T></b> is handy when you have to switch often between 2 objects. <b>IntBool</b> is a value type which can act as both <i>int</i> and <i>bool</i>.<br />
<br />
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"> <span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">class</span> CombineIntervals
{
<span style="color: blue;">public</span> <span style="color: blue;">static</span> IEnumerable<(T, T)> Combine<T>(<span style="color: blue;">this</span> IEnumerable<(T, T)> inc, IEnumerable<(T, T)> exc = <span style="color: blue;">null</span>) where T : IComparable
{
<span style="color: blue;">if</span> (exc == <span style="color: blue;">null</span>) exc = Enumerable.Empty<(T, T)>();
IEnumerable<(T val, <span style="color: blue;">bool</span> br, <span style="color: blue;">bool</span> ex) > GetBorders(IEnumerable<(T left, T right)> ranges, <span style="color: blue;">bool</span> ex)
{
<span style="color: blue;">foreach</span> (<span style="color: blue;">var</span> (left, right) <span style="color: blue;">in</span> ranges)
{
<span style="color: blue;">yield</span> <span style="color: blue;">return</span> (left, <span style="color: blue;">true</span>, ex);
<span style="color: blue;">yield</span> <span style="color: blue;">return</span> (right, <span style="color: blue;">false</span>, ex);
}
}
<span style="color: blue;">var</span> borders = GetBorders(inc, <span style="color: blue;">false</span>).Union(GetBorders(exc, <span style="color: blue;">true</span>)).OrderBy(x => x.val).ToArray();
T start = borders[0].val;
<span style="color: blue;">var</span> state = <span style="color: blue;">new</span> Pair<IntBool>();
<span style="color: blue;">foreach</span> (<span style="color: blue;">var</span> (val, br, ex) <span style="color: blue;">in</span> borders)
{
<span style="color: blue;">if</span> (state[ex].Xor(br))
{
<span style="color: blue;">if</span> (br == state[!ex])
<span style="color: blue;">yield</span> <span style="color: blue;">return</span> (start, val);
<span style="color: blue;">else</span> start = val;
}
state[ex] += br ? 1 : -1;
}
}
}
<span style="color: blue;">public</span> <span style="color: blue;">struct</span> Pair<T>
{
T a; T b;
<span style="color: blue;">public</span> T <span style="color: blue;">this</span>[IntBool i]
{
<span style="color: blue;">get</span> => i ? b : a;
<span style="color: blue;">set</span>
{
<span style="color: blue;">if</span> (i) b = value;
<span style="color: blue;">else</span> a = value;
}
}
<span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: blue;">string</span> ToString()
{
<span style="color: blue;">return</span> $<span style="color: #a31515;">"{a}, {b}"</span>;
}
<span style="color: blue;">internal</span> <span style="color: blue;">void</span> Deconstruct(<span style="color: blue;">out</span> T x, <span style="color: blue;">out</span> T y)
{
x = a;
y = b;
}
}
<span style="color: blue;">public</span> <span style="color: blue;">struct</span> IntBool
{
<span style="color: blue;">private</span> <span style="color: blue;">int</span> val;
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">implicit</span> <span style="color: blue;">operator</span> IntBool (<span style="color: blue;">int</span> x) => <span style="color: blue;">new</span> IntBool() { val = x };
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">implicit</span> <span style="color: blue;">operator</span> <span style="color: blue;">int</span>(IntBool x) => x.val;
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">implicit</span> <span style="color: blue;">operator</span> IntBool(<span style="color: blue;">bool</span> x) => <span style="color: blue;">new</span> IntBool() { val = x ? 1 : 0 };
<span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">implicit</span> <span style="color: blue;">operator</span> <span style="color: blue;">bool</span>(IntBool x) => x.val > 0;
<span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: blue;">string</span> ToString() => val.ToString();
<span style="color: blue;">public</span> <span style="color: blue;">bool</span> And(<span style="color: blue;">bool</span> x) => val == 1 && x;
<span style="color: blue;">public</span> <span style="color: blue;">bool</span> Xor(<span style="color: blue;">bool</span> x) => val == 1 && !x || val == 0 && x;
}</code></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-67790061430359097382016-05-18T22:17:00.002+04:002016-05-18T22:20:05.220+04:00Get a site's Favicon uriUsing HtmlAgilityPack NuGet package (Ms-Pl license):<br />
<!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #a31515; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<br />
<pre class="csharpcode"> <span class="kwrd">public</span> async <span class="kwrd">static</span> Task<Uri> GetFaviconUri(Uri page)
{
<span class="kwrd">var</span> doc = await <span class="kwrd">new</span> HtmlAgilityPack.HtmlWeb().LoadFromWebAsync(page.AbsoluteUri);
<span class="kwrd">var</span> href = doc.DocumentNode.Descendants(<span class="str">"link"</span>)
.Where(n => n.Attributes.Any(a => a.Name == <span class="str">"rel"</span> &&
a.Value == <span class="str">"icon"</span> || a.Value == <span class="str">"shortcut icon"</span>))
.FirstOrDefault()?.GetAttributeValue(<span class="str">"href"</span>, <span class="kwrd">null</span>);
<span class="kwrd">return</span> href == <span class="kwrd">null</span> ? <span class="kwrd">null</span> : <span class="kwrd">new</span> Uri(page, href);
}</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-19910056747153319082016-01-31T15:27:00.001+04:002016-01-31T17:42:23.207+04:00Splicing, combining, subtracting intervals of IComparable<div dir="ltr" style="text-align: left;" trbidi="on">
Idea is simple, you pass two collections of intervals (Tuple<T, T>), one for included values, another for excluded. Then overlapping intervals of the same kind are combined, and excluding intervals are subtracted from including intervals. As a result you get a new set of intervals.<br />
<br />
As T you can use any IComparable, like int, DateTime, double or your custom type.<br />
<br />
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<br />
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="keyword">using</span> System;
<span class="keyword">using</span> System.Collections.Generic;
<span class="keyword">using</span> System.Linq;
<span class="keyword">namespace</span> Test
{
<span class="comment">/*
Subtracting intervals of different kind:
include | ***** **** ***** *********** *** |
exclude | ****** ** ************** |
borders | i e e i i iee i i e i i i e |
result | *** **** * ** ****** |
Combining overlapping intervals of the same kind:
first | l....r |
second | l............r |
third | l...r |
all | l..l.r..l...r...r |
border | 1..2.1..2...1...0 |
(1..0) constitutes a combined interval
*/</span>
<span class="keyword">public</span> <span class="keyword">class</span> <span class="type">Interval</span>
{
<span class="keyword">public</span> <span class="keyword">enum</span> <span class="type">Border</span> { Left, Right };
<span class="keyword">public</span> <span class="keyword">enum</span> <span class="type">IntervalType</span> { Including, Excluding };
<span class="comment">//border point of an interval</span>
<span class="keyword">struct</span> <span class="type">Point</span><T>
{
<span class="keyword">public</span> T Val;
<span class="keyword">public</span> <span class="keyword">int</span> Brdr;
<span class="keyword">public</span> <span class="keyword">int</span> Intr;
<span class="keyword">public</span> Point(T <span class="keyword">value</span>, <span class="type">Border</span> border, <span class="type">IntervalType</span> interval)
{
Val = <span class="keyword">value</span>;
Brdr = (border == <span class="type">Border</span>.Left) ? 1 : -1;
Intr = (<span class="keyword">int</span>)interval;
}
<span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">string</span> ToString() =>
(Brdr == 1 ? <span class="string">"L"</span> : <span class="string">"R"</span>) + (Intr == 0 ? <span class="string">"+ "</span> : <span class="string">"- "</span>) + Val;
}
<span class="keyword">private</span> <span class="keyword">static</span> <span class="type">IEnumerable</span><<span class="type">Point</span><T>> GetBorders<T>
(<span class="type">IEnumerable</span><<span class="type">Tuple</span><T, T>> src,
<span class="type">IntervalType</span> intr) =>
src.<span class="type">Select</span>(p => <span class="keyword">new</span>[] { p.Item1, p.Item2 }).SelectMany(p => p).
<span class="type">Select</span>((v, idx) => <span class="keyword">new</span> <span class="type">Point</span><T>(v, (<span class="type">Border</span>)(idx % 2), intr));
<span class="keyword">public</span> <span class="keyword">static</span> <span class="type">IEnumerable</span><<span class="type">Tuple</span><T, T>> Combine<T>(
<span class="type">IEnumerable</span><<span class="type">Tuple</span><T, T>> <span class="type">Include</span>, <span class="type">IEnumerable</span><<span class="type">Tuple</span><T, T>> Exclude)
<span class="keyword">where</span> T : <span class="type">IComparable</span>
{
<span class="type">var</span> INs = GetBorders(<span class="type">Include</span>, <span class="type">IntervalType</span>.Including);
<span class="type">var</span> EXs = GetBorders(Exclude, <span class="type">IntervalType</span>.Excluding);
<span class="type">var</span> intrs = <span class="keyword">new</span> <span class="keyword">int</span>[2]; <span class="comment">//current interval border control In[0], Ex[1]</span>
T start = <span class="keyword">default</span>(T); <span class="comment">//left border of a new resulting interval</span>
<span class="comment">//put all points in a line and loop:</span>
<span class="keyword">foreach</span> (<span class="type">var</span> p <span class="keyword">in</span> INs.<span class="type">Union</span>(EXs).OrderBy(x => x.Val))
{
<span class="comment">//check for start (close) of a new (cur) interval:</span>
<span class="type">var</span> change = (intrs[p.Intr] == 0) ^ (intrs[p.Intr] + p.Brdr == 0);
intrs[p.Intr] += p.Brdr;
<span class="keyword">if</span> (!change) <span class="keyword">continue</span>;
<span class="type">var</span> In = p.Intr == 0 && intrs[1] == 0; <span class="comment">//w no cur Ex</span>
<span class="type">var</span> Ex = p.Intr == 1 && intrs[0] > 0; <span class="comment">//breaks cur In</span>
<span class="type">var</span> Open = intrs[p.Intr] > 0;
<span class="type">var</span> Close = !Open;
<span class="keyword">if</span> (<span class="type">In</span> && Open || Ex && <span class="type">Close</span>)
{
start = p.Val;
}
<span class="keyword">else</span> <span class="keyword">if</span> (<span class="type">In</span> && <span class="type">Close</span> || Ex && Open)
{
<span class="keyword">yield</span> <span class="keyword">return</span> <span class="keyword">new</span> <span class="type">Tuple</span><T, T>(start, p.Val);
}
}
}
}
}<!--[if IE]>
<![endif]--></pre>
</div>
<br />
<br />
Example of usage:<br />
<br />
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<br />
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<br />
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="keyword">class</span> <span class="type">Program</span>
{
<span class="keyword">static</span> <span class="keyword">void</span> Main(<span class="keyword">string</span>[] args)
{
<span class="type">var</span> include = <span class="keyword">new</span>[] {
<span class="keyword">new</span> <span class="type">Tuple</span><<span class="keyword">int</span>, <span class="keyword">int</span>>(10, 100),
<span class="keyword">new</span> <span class="type">Tuple</span><<span class="keyword">int</span>, <span class="keyword">int</span>>(200, 300),
<span class="keyword">new</span> <span class="type">Tuple</span><<span class="keyword">int</span>, <span class="keyword">int</span>>(400, 500),
<span class="keyword">new</span> <span class="type">Tuple</span><<span class="keyword">int</span>, <span class="keyword">int</span>>(420, 480),
};
<span class="type">var</span> exclude = <span class="keyword">new</span>[] {
<span class="keyword">new</span> <span class="type">Tuple</span><<span class="keyword">int</span>, <span class="keyword">int</span>>(95, 200),
<span class="keyword">new</span> <span class="type">Tuple</span><<span class="keyword">int</span>, <span class="keyword">int</span>>(410, 420),
};
<span class="keyword">foreach</span> (<span class="type">var</span> i <span class="keyword">in</span> Interval.Combine(include, exclude))
<span class="type">Console</span>.WriteLine(i.Item1 + <span class="string">"-"</span> + i.Item2);
<span class="type">Console</span>.ReadLine();
}
}<!--[if IE]>
<![endif]--></pre>
</div>
</div>
<br />
The output will be<br />
10-95<br />
205-300<br />
400-410<br />
420-500<br />
<br />
NB! border values of excluding intervals are not excluded. E.g. when you subtract (5..10) from [1..7] you end up with [1..5]. To exclude 5, widen the excluding interval like (5..10) => (4..11).
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-78580539727921846272016-01-31T14:30:00.000+04:002016-01-31T14:31:49.775+04:00Alias ugly generic type names<div dir="ltr" style="text-align: left;" trbidi="on">
Though aliasing (with <b>using</b> keyword) generic types is not possible as of C# 6.0, sometimes you can go with inheritance:<br />
<br />
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<br />
<div class="csharpcode">
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="keyword">public</span> <span class="keyword">class</span> <span class="type">MyList</span><T1, T2> :
<span class="type">List</span><<span class="type">Tuple</span><<span class="type">IEnumerable</span><<span class="type">HashSet</span><T1>>, <span class="type">IComparable</span><T2>>>
{ }
<span class="keyword">public</span> <span class="keyword">void</span> Meth()
{
<span class="type">var</span> x = <span class="keyword">new</span> <span class="type">MyList</span><<span class="keyword">int</span>, <span class="keyword">bool</span>>();
}<!--[if IE]>
<![endif]--></pre>
</div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-7028565315226756702016-01-30T09:01:00.001+04:002016-01-30T09:01:25.750+04:00Circular Linked List<div dir="ltr" style="text-align: left;" trbidi="on">
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="type">CircularLinkedList</span>
{
<span class="keyword">public</span> <span class="keyword">static</span> <span class="type">LinkedListNode</span><<span class="type">T</span>> NextOrFirst<<span class="type">T</span>>(<span class="keyword">this</span> <span class="type">LinkedListNode</span><<span class="type">T</span>> current)
{
<span class="keyword">return</span> current.Next ?? current.<span class="type">List</span>.First;
}
<span class="keyword">public</span> <span class="keyword">static</span> <span class="type">LinkedListNode</span><<span class="type">T</span>> PreviousOrLast<<span class="type">T</span>>(<span class="keyword">this</span> <span class="type">LinkedListNode</span><<span class="type">T</span>> current)
{
<span class="keyword">return</span> current.Previous ?? current.<span class="type">List</span>.Last;
}
<span class="keyword">public</span> <span class="keyword">static</span> <span class="type">LinkedListNode</span><<span class="type">T</span>> Rewind<<span class="type">T</span>>(<span class="keyword">this</span> <span class="type">LinkedListNode</span><<span class="type">T</span>> current, <span class="keyword">int</span> num)
{
<span class="keyword">while</span> (num != 0)
{
current = num > 0 ? current.NextOrFirst() : current.PreviousOrLast();
num -= <span class="type">Math</span>.Sign(num);
}
<span class="keyword">return</span> current;
}
}<!--[if IE]>
<![endif]--></pre>
</div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-56076719558582928382016-01-30T08:51:00.000+04:002016-01-30T08:51:06.195+04:00UWP: where are my solution's Content files?<div dir="ltr" style="text-align: left;" trbidi="on">
Package.Current.InstalledLocation</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-70765466866647189742015-09-11T09:40:00.002+04:002015-09-11T09:40:26.542+04:00Wrap an object into an IEnumerable of single item<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<div class='csharpcode'>Code:<pre style='border:1px dashed #CCCCCC;overflow-x:auto;overflow-y:hidden;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height20px;color:#000000;word-wrap:normal;'><span class='keyword'>public</span> <span class='keyword'>static</span> <span class='type'>IEnumerable</span><<span class='type'>T</span>> Yield<<span class='type'>T</span>>(<span class='keyword'>this</span> <span class='type'>T</span> item)
{
<span class='keyword'>yield</span> <span class='keyword'>return</span> item;
}</pre></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-4556371871772749412015-09-11T09:31:00.001+04:002015-09-11T09:31:25.625+04:00Faster TakeBy<div dir="ltr" style="text-align: left;" trbidi="on">
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="keyword">public</span> <span class="keyword">static</span> <span class="type">IEnumerable</span><<span class="type">IEnumerable</span><<span class="type">T</span>>> TakeBy<<span class="type">T</span>>(<span class="keyword">this</span> <span class="type">IEnumerable</span><<span class="type">T</span>> source, <span class="keyword">int</span> count)
{
<span class="type">var</span> grps = source.<span class="type">Select</span>((val, i) => <span class="keyword">new</span> { idx = i / count, val }).GroupBy(e => e.idx);
<span class="keyword">return</span> grps.Select(g => g.<span class="type">Select</span>(e => e.val));
}<!--[if IE]>
<![endif]--></pre>
</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-73943103055033114042015-09-10T14:24:00.001+04:002015-09-10T14:24:55.779+04:00Combinatorics: get all combinations of k elements from an input sequence<div dir="ltr" style="text-align: left;" trbidi="on">
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<br />
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="keyword">public</span> <span class="keyword">static</span> <span class="type">IEnumerable</span><<span class="type">IEnumerable</span><<span class="type">T</span>>> Combine<<span class="type">T</span>>(<span class="keyword">this</span> <span class="type">IEnumerable</span><<span class="type">T</span>> list, <span class="keyword">int</span> k = 2, <span class="keyword">bool</span> repetition = <span class="keyword">false</span>)
{
<span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < list.Count(); i++)
{
<span class="type">T</span> cur = list.Skip(i).First();
<span class="keyword">if</span> (k == 1)
{
<span class="keyword">yield</span> <span class="keyword">return</span> cur.Yield();
}
<span class="keyword">else</span>
{
<span class="keyword">foreach</span> (<span class="type">var</span> res <span class="keyword">in</span> list.Skip(i + (repetition ? 0 : 1)).Combine(k - 1, repetition))
{
<span class="keyword">yield</span> <span class="keyword">return</span> res.Prepend(cur);
}
}
}
}<!--[if IE]>
<![endif]--></pre>
</div>
<br />
e.g.<br />
{ 1, 2, 3 }.Combine(2) = {{ 1, 2 }, { 1, 3 }, { 2, 3 }}<br />
{ 1, 2 }.Combine(2, true) = {{ 1, 1 }, { 1, 2 }, { 2, 2 }}<br />
{ 1, 2, 3, 4 }.Combine(3) = {{ 1, 2, 3 }, { 1, 2, 4 }, { 2, 3, 4 }}</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-77979038661082223082015-08-07T10:19:00.004+04:002015-08-07T10:24:19.465+04:00Get number of flags from an enum variable<div dir="ltr" style="text-align: left;" trbidi="on">
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<br />
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="type">EnumHelper</span>
{
<span class="keyword">public</span> <span class="keyword">static</span> <span class="type">UInt32</span> NumFlags(<span class="keyword">this</span> <span class="type">Enum</span> e)
{
<span class="type">UInt32</span> v = <span class="type">Convert</span>.ToUInt32(e);
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
<span class="type">UInt32</span> count = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
<span class="keyword">return</span> count;
}
}<!--[if IE]>
<![endif]--></pre>
</div>
<br />
This is some kind of black magic, works very fast.
Got <a href="http://stackoverflow.com/a/14713187/1838137">here</a>.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-16311850196575491402015-08-07T09:51:00.003+04:002015-08-07T11:10:49.770+04:00Lazy struct<div dir="ltr" style="text-align: left;" trbidi="on">
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"> <span class="keyword">struct</span> <span class="type">Lazy</span><T>
{
T <span class="keyword">value</span>;
<span class="keyword">bool</span> init;
<span class="type">Func</span><T> factory;
<span class="keyword">public</span> Lazy(<span class="type">Func</span><T> f)
{
factory = f;
init = <span class="keyword">false</span>;
<span class="keyword">value</span> = <span class="keyword">default</span>(T);
}
<span class="keyword">public</span> T Value
{
<span class="keyword">get</span>
{
<span class="keyword">if</span> (init) <span class="keyword">return</span> <span class="keyword">value</span>;
<span class="keyword">else</span>
{
init = <span class="keyword">true</span>;
<span class="keyword">return</span> <span class="keyword">value</span> = factory();
}
}
}
}</pre>
</div>
<b><br /></b>
<b><br /></b>
<b>Variant with a single argument</b><br />
is useful when we want to use a non-local function and don't want to use closure (for better performance)
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<br />
<br />
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"> <span class="keyword">struct</span> <span class="type">Lazy</span><TVal, TArg>
{
TVal <span class="keyword">value</span>;
TArg arg;
<span class="keyword">bool</span> init;
<span class="type">Func</span><TArg, TVal> factory;
<span class="keyword">public</span> Lazy(<span class="type">Func</span><TArg, TVal> f, TArg arg)
{
factory = f;
init = <span class="keyword">false</span>;
<span class="keyword">value</span> = <span class="keyword">default</span>(TVal);
<span class="keyword">this</span>.arg = arg;
}
<span class="keyword">public</span> TVal Value
{
<span class="keyword">get</span>
{
<span class="keyword">if</span> (init) <span class="keyword">return</span> <span class="keyword">value</span>;
<span class="keyword">else</span>
{
init = <span class="keyword">true</span>;
<span class="keyword">return</span> <span class="keyword">value</span> = factory(arg);
}
}
}
}</pre>
</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-85976188061191977002015-05-19T14:34:00.000+04:002016-01-30T10:04:36.687+04:00Linq TakeBy<div dir="ltr" style="text-align: left;" trbidi="on">
I was about to write such an extension<br />
But then desided to google for it first, and voila:<br />
<br />
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: "Courier New";
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2B91AF; }
.csharpcode .keyword { color: #0000FF; }
.csharpcode .string { color: #A31515; }
.csharpcode .preproc { color: #0000FF; }
</style>
<div class="csharpcode">
Code:<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; color: black; overflow-x: auto; overflow-y: hidden; padding: 0px; text-align: left; word-wrap: normal;"><span class="comment2">///</span><span class="comment"> </span><span class="comment2"><summary></span><span class="comment"></span>
<span class="comment2">///</span><span class="comment"> </span><span class="comment2"><paramref name="source"/></span><span class="comment">中の要素を</span><span class="comment"></span><span class="comment2"><paramref name="count"/></span><span class="comment"></span>
<span class="comment2">///</span><span class="comment"> 個ごとにまとめ直します。</span>
<span class="comment2">///</span><span class="comment"> 最後の要素数が足りない場合は足りないまま返します。</span>
<span class="comment2">///</span><span class="comment"> </span><span class="comment2"></summary></span><span class="comment"></span>
<span class="keyword">public</span> <span class="keyword">static</span> <span class="type">IEnumerable</span><<span class="type">IEnumerable</span><<span class="type">TSource</span>>> TakeBy<<span class="type">TSource</span>>(<span class="keyword">this</span> <span class="type">IEnumerable</span><<span class="type">TSource</span>> source, <span class="keyword">int</span> count)
{
<span class="keyword">if</span> (source == <span class="keyword">null</span>)
{
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">ArgumentNullException</span>(<span class="string">"source"</span>);
}
<span class="keyword">if</span> (count < 1)
{
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">ArgumentOutOfRangeException</span>(<span class="string">"count"</span>);
}
<span class="keyword">while</span> (source.Any())
{
<span class="keyword">yield</span> <span class="keyword">return</span> source.Take(count);
source = source.Skip(count);
}
}<!--[if IE]>
<![endif]--></pre>
</div>
<br />
<a href="https://github.com/ebifrier/Ragnarok/blob/master/Ragnarok/Extension.cs">got it here</a><br />
<div>
Isn't it nice?<br />
<br />
ps: <a href="http://tsayper.blogspot.ru/2015/09/faster-takeby.html">this</a> variant is much faster</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-71216504417506466732014-10-22T09:13:00.001+04:002014-10-24T08:39:49.990+04:00Easy hierarchy traversal w/o recursion<div dir="ltr" style="text-align: left;" trbidi="on">
<pre class="csharp" style="font-family: monospace;"> <span style="color: #6666cc; font-weight: bold;">class</span> Program
<span style="color: green;">{</span>
<span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: green;">(</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: green;">[</span><span style="color: green;">]</span> args<span style="color: green;">)</span>
<span style="color: green;">{</span>
Node n1 <span style="color: green;">=</span> <span style="color: green;">new</span> Node<span style="color: green;">(</span><span style="color: #0600ff; font-weight: bold;">null</span>, <span style="color: #666666;">"1. table"</span><span style="color: green;">)</span><span style="color: green;">;</span>
Node n2 <span style="color: green;">=</span> <span style="color: green;">new</span> Node<span style="color: green;">(</span><span style="color: #0600ff; font-weight: bold;">null</span>, <span style="color: #666666;">"2. chair"</span><span style="color: green;">)</span><span style="color: green;">;</span>
Node n11 <span style="color: green;">=</span> <span style="color: green;">new</span> Node<span style="color: green;">(</span>n1, <span style="color: #666666;">"1.1. teapot"</span><span style="color: green;">)</span><span style="color: green;">;</span>
Node n12 <span style="color: green;">=</span> <span style="color: green;">new</span> Node<span style="color: green;">(</span>n1, <span style="color: #666666;">"1.2. cup"</span><span style="color: green;">)</span><span style="color: green;">;</span>
Node n121 <span style="color: green;">=</span> <span style="color: green;">new</span> Node<span style="color: green;">(</span>n12, <span style="color: #666666;">"1.2.1. tea"</span><span style="color: green;">)</span><span style="color: green;">;</span>
Node n21 <span style="color: green;">=</span> <span style="color: green;">new</span> Node<span style="color: green;">(</span>n2, <span style="color: #666666;">"2.1. man"</span><span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">var</span> topLevel <span style="color: green;">=</span> <span style="color: green;">new</span> Node<span style="color: green;">[</span><span style="color: green;">]</span> <span style="color: green;">{</span> n1, n2 <span style="color: green;">}</span><span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">var</span> flat <span style="color: green;">=</span> Traverse<span style="color: green;">(</span>topLevel<span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">foreach</span> <span style="color: green;">(</span><span style="color: #0600ff; font-weight: bold;">var</span> n <span style="color: #0600ff; font-weight: bold;">in</span> flat<span style="color: green;">.</span><span style="color: blue;">OrderBy</span><span style="color: green;">(</span>n<span style="color: green;">=></span>n<span style="color: green;">.</span><span style="color: blue;">name</span><span style="color: green;">)</span><span style="color: green;">)</span>
<span style="color: green;">{</span>
Console<span style="color: green;">.</span><span style="color: blue;">WriteLine</span><span style="color: green;">(</span><span style="color: green;">new</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: green;">(</span><span style="color: #666666;">'<span style="color: teal; font-weight: bold;">\t</span>'</span>, n<span style="color: green;">.</span><span style="color: blue;">level</span><span style="color: green;">)</span> <span style="color: green;">+</span> n<span style="color: green;">.</span><span style="color: blue;">name</span><span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: green;">}</span>
Console<span style="color: green;">.</span><span style="color: blue;">ReadLine</span><span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: green;">}</span>
<span style="color: #0600ff; font-weight: bold;">static</span> IEnumerable<span style="color: green;"><</span>Node<span style="color: green;">></span> Traverse<span style="color: green;">(</span>IEnumerable<span style="color: green;"><</span>Node<span style="color: green;">></span> top<span style="color: green;">)</span>
<span style="color: green;">{</span>
Stack<span style="color: green;"><</span>Node<span style="color: green;">></span> s <span style="color: green;">=</span> <span style="color: green;">new</span> Stack<span style="color: green;"><</span>Node<span style="color: green;">></span><span style="color: green;">(</span>top<span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">while</span> <span style="color: green;">(</span>s<span style="color: green;">.</span><span style="color: blue;">Count</span> <span style="color: green;">></span> <span style="color: red;">0</span><span style="color: green;">)</span>
<span style="color: green;">{</span>
<span style="color: #0600ff; font-weight: bold;">var</span> next <span style="color: green;">=</span> s<span style="color: green;">.</span><span style="color: blue;">Pop</span><span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">yield</span> <span style="color: #0600ff; font-weight: bold;">return</span> next<span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">foreach</span> <span style="color: green;">(</span><span style="color: #0600ff; font-weight: bold;">var</span> n <span style="color: #0600ff; font-weight: bold;">in</span> next<span style="color: green;">.</span><span style="color: blue;">nodes</span><span style="color: green;">)</span>
<span style="color: green;">{</span>
s<span style="color: green;">.</span><span style="color: blue;">Push</span><span style="color: green;">(</span>n<span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: green;">}</span>
<span style="color: green;">}</span>
<span style="color: green;">}</span>
<span style="color: green;">}</span>
<span style="color: #6666cc; font-weight: bold;">class</span> Node
<span style="color: green;">{</span>
<span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> level<span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">public</span> List<span style="color: green;"><</span>Node<span style="color: green;">></span> nodes <span style="color: green;">=</span> <span style="color: green;">new</span> List<span style="color: green;"><</span>Node<span style="color: green;">></span><span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> name<span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">public</span> Node<span style="color: green;">(</span>Node parent, <span style="color: #6666cc; font-weight: bold;">string</span> name<span style="color: green;">)</span>
<span style="color: green;">{</span>
<span style="color: #0600ff; font-weight: bold;">this</span><span style="color: green;">.</span><span style="color: blue;">name</span> <span style="color: green;">=</span> name<span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">if</span> <span style="color: green;">(</span>parent <span style="color: green;">!=</span> <span style="color: #0600ff; font-weight: bold;">null</span><span style="color: green;">)</span>
<span style="color: green;">{</span>
parent<span style="color: green;">.</span><span style="color: blue;">nodes</span><span style="color: green;">.</span><span style="color: #0600ff; font-weight: bold;">Add</span><span style="color: green;">(</span><span style="color: #0600ff; font-weight: bold;">this</span><span style="color: green;">)</span><span style="color: green;">;</span>
level <span style="color: green;">=</span> parent<span style="color: green;">.</span><span style="color: blue;">level</span> <span style="color: green;">+</span> <span style="color: red;">1</span><span style="color: green;">;</span>
<span style="color: green;">}</span>
<span style="color: #0600ff; font-weight: bold;">else</span>
<span style="color: green;">{</span>
level <span style="color: green;">=</span> <span style="color: red;">0</span><span style="color: green;">;</span>
<span style="color: green;">}</span>
<span style="color: green;">}</span>
<span style="color: green;">}</span></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRa04OhzKRhqFv8J0XdukEYr_iNf9eZNSazYR4n4CvCh-G3Lwwr0UyhJtcNsDc_Mu0ea6Kgkq2kznGzW5UuayU3zIcYPSBh6b5boS5XqeGn8oTPxlzJV6mOB9QqOe9HfBfb1kiExal5PI/s1600/res.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRa04OhzKRhqFv8J0XdukEYr_iNf9eZNSazYR4n4CvCh-G3Lwwr0UyhJtcNsDc_Mu0ea6Kgkq2kznGzW5UuayU3zIcYPSBh6b5boS5XqeGn8oTPxlzJV6mOB9QqOe9HfBfb1kiExal5PI/s1600/res.png" /></a></div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8451864071377897831.post-40984017621812021152014-10-16T10:12:00.005+04:002014-10-16T10:27:34.099+04:00Delegates act as value types<div dir="ltr" style="text-align: left;" trbidi="on">
<pre class="csharp" style="font-family: monospace;"><span style="background-color: white;">Action a1 <span style="color: green;">=</span> <span style="color: green;">(</span><span style="color: green;">)</span> <span style="color: green;">=></span> Console<span style="color: green;">.</span><span style="color: blue;">Write</span><span style="color: green;">(</span><span style="color: #666666;">"1 "</span><span style="color: green;">)</span><span style="color: green;">;</span>
Action a2 <span style="color: green;">=</span> <span style="color: green;">(</span><span style="color: green;">)</span> <span style="color: green;">=></span> Console<span style="color: green;">.</span><span style="color: blue;">Write</span><span style="color: green;">(</span><span style="color: #666666;">"2 "</span><span style="color: green;">)</span><span style="color: green;">;</span>
Action tmp <span style="color: green;">=</span> a1<span style="color: green;">;</span>
a1 <span style="color: green;">+=</span> a2<span style="color: green;">;</span>
a2 <span style="color: green;">=</span> tmp<span style="color: green;">;</span>
Console<span style="color: green;">.</span><span style="color: blue;">Write</span><span style="color: green;">(</span><span style="color: #666666;">"a1:<span style="color: teal; font-weight: bold;">\t</span>"</span><span style="color: green;">)</span><span style="color: green;">;</span>
a1<span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">;</span> <span style="color: teal; font-style: italic;">//1 2</span>
Console<span style="color: green;">.</span><span style="color: blue;">Write</span><span style="color: green;">(</span><span style="color: #666666;">"<span style="color: teal; font-weight: bold;">\n</span>a2:<span style="color: teal; font-weight: bold;">\t</span>"</span><span style="color: green;">)</span><span style="color: green;">;</span>
a2<span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">;</span> <span style="color: teal; font-style: italic;">//1</span>
Console<span style="color: green;">.</span><span style="color: blue;">ReadLine</span><span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">;</span></span></pre>
<br />
its because delegates are immutable, <a href="http://stackoverflow.com/questions/26396843/delegates-act-as-value-types/">just like strings</a>.<br />
<span style="background-color: #eeeeee;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">a1 </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">+=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"> a2</span></span> is a shugar for <span style="background-color: #eeeeee;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">a1 </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; color: #2b91af; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">Action</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">)</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; color: #2b91af; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">Delegate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; color: #2b91af; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">Combine</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">a1</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"> a2</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">)</span></span></div>
Unknownnoreply@blogger.com0