<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>NicolBlog : c#</title><link>http://blogs.msdn.com/nicold/archive/tags/c_2300_/default.aspx</link><description>Tags: c#</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>NicolTIP#006: how to show previous and next item using LINQ</title><link>http://blogs.msdn.com/nicold/archive/2009/06/03/nicoltip-006-how-to-show-previous-and-next-item-using-linq.aspx</link><pubDate>Wed, 03 Jun 2009 17:04:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9691302</guid><dc:creator>NicolD</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/nicold/comments/9691302.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nicold/commentrss.aspx?PostID=9691302</wfw:commentRss><description>&lt;p&gt;I had a table on SQL 2005 I am accessing it via LINQ. I had to select an item via a “where” condition (see below).&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var item = (from snap in adc.Snapshots     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where snap.file == image      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select snap).First();&lt;/font&gt;&lt;/p&gt; &lt;!--CRLF--&gt;  &lt;p&gt;The problem was that I needed to identify the previous item and the next item too because we had to show them on a web page. Talking with some collgues of mine we found the following way that looks quite smart:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var previous = adc.Snapshots.OrderByDescending(s =&amp;gt; s.InsertDateTime).Where(s =&amp;gt; string.Compare(s.file, image) &amp;lt; 0).FirstOrDefault();      &lt;br /&gt;var item = adc.Snapshots.OrderBy(s =&amp;gt; s.InsertDateTime).Where(s =&amp;gt; s.file == image).SingleOrDefault();       &lt;br /&gt;var next = adc.Snapshots.OrderBy(s =&amp;gt; s.InsertDateTime).Where(s =&amp;gt; string.Compare(s.file, image) &amp;gt; 0).FirstOrDefault();&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9691302" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nicold/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/nicold/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Update WinForm interface from a different thread</title><link>http://blogs.msdn.com/nicold/archive/2007/12/29/update-winform-interface-from-a-different-thread.aspx</link><pubDate>Sat, 29 Dec 2007 20:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6899052</guid><dc:creator>NicolD</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/nicold/comments/6899052.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nicold/commentrss.aspx?PostID=6899052</wfw:commentRss><description>&lt;p&gt;Well, this is a typical issue when you have a thread that works (i.e. a Workflow) and a UI that needs to be updated.&lt;/p&gt; &lt;p&gt;Let assume that you have a WinFom and you need to update its windows Title from another thread. The other thread needs to call "UpdateTitle" public method of current Form instance. If you write the following code:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainForm : Form
{
   ...
   
   &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitle(&lt;span class="kwrd"&gt;string&lt;/span&gt; newTitle)
   {
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;         
   }

   ...
}&lt;/pre&gt;
&lt;style type="text/css"&gt;.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: #006080; }
.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; }
&lt;/style&gt;

&lt;p&gt;
&lt;p&gt;&lt;span class="kwrd"&gt;UpdateTitle will work only if you call the method from the UI thread.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In order to make this call thread safe, I found two ways, choose the one that fits your needs:-)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Method ONE: Using a delegate&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainForm : Form
{
   ...
   
   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitleDelegate(&lt;span class="kwrd"&gt;string&lt;/span&gt; s);
   &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitle(&lt;span class="kwrd"&gt;string&lt;/span&gt; newTitle)
   {
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.InvokeRequired)             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Invoke(&lt;span class="kwrd"&gt;new&lt;/span&gt; UpdateTitleDelegate                 
         (&lt;span class="kwrd"&gt;this&lt;/span&gt;.UpdateTitle), newTitle);         
   &lt;span class="kwrd"&gt;else&lt;/span&gt;         
      {             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;         
      }
   }

   ...
}&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.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: #006080; }
.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; }&lt;/style&gt;

&lt;style type="text/css"&gt;
.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: #006080; }
.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; }&lt;/style&gt;

&lt;style type="text/css"&gt;
.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: #006080; }
.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; }&lt;/style&gt;

&lt;h1&gt;Method TWO: using MethodInvoker&lt;/h1&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainForm : Form
{
   ...
      
   &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateTitle(&lt;span class="kwrd"&gt;string&lt;/span&gt; newTitle)
   {
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.InvokeRequired)             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Invoke(&lt;span class="kwrd"&gt;new&lt;/span&gt; MethodInvoker(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;()
      {
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;    
      }));
   &lt;span class="kwrd"&gt;else&lt;/span&gt;         
      {             
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Text = newTitle;         
      }
   }
   ...
}
&lt;/pre&gt;
&lt;p&gt;For more information have a look to &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx" target="_blank"&gt;Control.InvokeRequired&lt;/a&gt; property on MSDN.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6899052" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nicold/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Threading/default.aspx">Threading</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Windows+Form/default.aspx">Windows Form</category></item><item><title>Avoid threads deadlock</title><link>http://blogs.msdn.com/nicold/archive/2007/10/03/avoid-threads-deadlock.aspx</link><pubDate>Wed, 03 Oct 2007 16:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5262868</guid><dc:creator>NicolD</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/nicold/comments/5262868.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nicold/commentrss.aspx?PostID=5262868</wfw:commentRss><description>&lt;P&gt;On this month's issue of MSDN Magazine, &lt;A class="" href="http://blogs.msdn.com/toub/" target=_blank mce_href="http://blogs.msdn.com/toub/"&gt;Stephen Toub&lt;/A&gt; describe the class&amp;nbsp;DdMonitor. DdMonitor implements almost all interfaces exposed by .NET System.Threading.Monitor class but&amp;nbsp;includes deadlock detection capabilities too. &lt;/P&gt;
&lt;P&gt;With the objective to make available a&amp;nbsp;lock(...) keyword replacement, a static DdMonitor.Lock(...) is implemented too.&lt;/P&gt;
&lt;P&gt;&lt;A class="" href="http://msdn.microsoft.com/msdnmag/issues/07/10/netmatters/default.aspx" target=_blank mce_href="http://msdn.microsoft.com/msdnmag/issues/07/10/netmatters/default.aspx"&gt;A System.Threading.Monitor replacement to avoid threads deadlocks&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5262868" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nicold/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Deadlock/default.aspx">Deadlock</category><category domain="http://blogs.msdn.com/nicold/archive/tags/Threading/default.aspx">Threading</category></item><item><title>How to digitally sign a string</title><link>http://blogs.msdn.com/nicold/archive/2007/09/03/how-to-digitally-sign-a-string.aspx</link><pubDate>Mon, 03 Sep 2007 11:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4719486</guid><dc:creator>NicolD</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/nicold/comments/4719486.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nicold/commentrss.aspx?PostID=4719486</wfw:commentRss><description>&lt;P&gt;The first step is to create a pair of key(pulic/private):&lt;/P&gt;&lt;PRE class=code&gt;RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();&lt;BR&gt;string publicKey = RSA.ToXmlString(false);&lt;BR&gt;string privateKey = RSA.ToXmlString(true);
&lt;/PRE&gt;Private key is required to sign the string. Public key is required to verify if the sign is valid or not. 
&lt;P&gt;Sequence required to create a sign is:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;select a private key&lt;/LI&gt;
&lt;LI&gt;select an HASH algorithm to create one starting from the string to sign (you'll sign the hash, not the string)&lt;/LI&gt;
&lt;LI&gt;create a sign starting from the hash&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;As shown bellow:&lt;/P&gt;&lt;PRE class=code&gt;RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();&lt;BR&gt;RSA.FromXmlString(privateKey);&lt;BR&gt;RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);&lt;BR&gt;RSAFormatter.SetHashAlgorithm("SHA1");&lt;BR&gt;SHA1Managed SHhash = new SHA1Managed();&lt;BR&gt;byte[] SignedHashValue = RSAFormatter.CreateSignature( SHhash.ComputeHash(new UnicodeEncoding().GetBytes(stringToBeSigned)));&lt;BR&gt;string signature = System.Convert.ToBase64String(SignedHashValue);
&lt;/PRE&gt;Sequence of operations needed to verify a signature is instead: 
&lt;UL&gt;
&lt;LI&gt;select the proper public key&lt;/LI&gt;
&lt;LI&gt;select the HASH algorithm to create one starting from the string to be verified&lt;/LI&gt;
&lt;LI&gt;veirfy the sign&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;as shown below:&lt;/P&gt;&lt;PRE class=code&gt;RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();&lt;BR&gt;RSA.FromXmlString(publicKey);&lt;BR&gt;RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);&lt;BR&gt;RSADeformatter.SetHashAlgorithm("SHA1");&lt;BR&gt;SHA1Managed SHhash = new SHA1Managed();&lt;BR&gt;if (RSADeformatter.VerifySignature( &lt;BR&gt;&amp;nbsp;SHhash.ComputeHash(new UnicodeEncoding().GetBytes(stringToBeVerified)),&lt;BR&gt;&amp;nbsp;System.Convert.FromBase64String(signature))&lt;BR&gt;&amp;nbsp;)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;/// The signature is valid.&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;else&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;/// The signature is not valid.&lt;BR&gt;&amp;nbsp;}
&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4719486" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nicold/archive/tags/Signing/default.aspx">Signing</category><category domain="http://blogs.msdn.com/nicold/archive/tags/c_2300_/default.aspx">c#</category></item></channel></rss>