Posts RSS Comments RSS 136 Posts and 267 Comments till now

Archive for the '.NET' Category

EnableEventValidation Error

Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation=”true”/> in configuration or <%@ Page EnableEventValidation=”true” %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Event validation is a security measure by ASP.NET to prevent Injection-Attack (i.e. other page post their result to your ASPX page). Turning this option off through the web.config or inside the <%@ Page .. %> tag will guarantee you will never receive above error, but your security might be compromised.

But if your page still producing above error, say when you click a button, or select the value of a server dropdownlist control, these conditions might be applicable to your ASPX page:

  1. You have another <form /> tag inside your main Form tag
  2. Your AJAX/Javascript code changed the value of a server control
  3. You type tags that resemble HTML tags inside a textbox/text-area

What I have today was number 1. I found a <form /> tag inside a < asp:Content .. /> tag. The error came out when I convert my ASP.NET Website project into .NET Web Application Project. So its quite surprising that page never throw any Event validation error during its tenure as Website project. Another possibility is the <form /> was generated by Visual Studio when i convert the project. I’ll do some trial and error more tomorrow…

C# Regex Word Count

I notice from my traffic log that there was someone bumping to this blog searching for ‘C# Regex Word Count’. Since I never create such tutorial, so here you go.

The basic rule of a word would be it doesn’t contain any whitespaces (spaces, tabs, or newlines). So the easiest Regex would be:

 

[^\ ^\t^\n]+

 

Now to implement it using C#, It would be as follows:

      public int WordCount(String input)
      {
         int result = 0;
         try
         {
            Regex rgx = new Regex(@"[^\ ^\t^\n]+");
            MatchCollection mcMatches = rgx.Matches(input);
            result = mcMatches.Count;
         }
         catch (Exception ex)
         {
         }
         return result;
      }

An improvement would be putting the Regex creation out of the function, this way we will not re-created the Regex everytime the function is called.

Sorting Words by Their Length

Don’t ask why I come up with this post :) Let’s just say it has something to do with Regular Expression.

 

The first method that immediately come up to mind (and usually the worst :) ) is as follows:

struct Res
{
   //To Record the Result
   public String words;
   public int wordcount;
}

public static Res WorstWordByLengthSort(string raw)
{
   Res myresult = new Res();
   myresult.wordcount = 0;
   string[] words = raw.Split("n".ToCharArray());
   raw = "";
   foreach (string word in words)
      raw += word + " ";

   words = raw.Split(" ".ToCharArray());
   ArrayList ar = new ArrayList();

   foreach (string word in words)
   {
      string tstr = word.Trim();
      if (tstr == "")
         continue;
      myresult.wordcount++;
      if (ar.Count == 0)
      {
         ar.Add(tstr);
      }
      else
      {
          int count = ar.Count;
          bool inserted = false;
          for (int i = 0; i < count; i++)
          {
              if (ar[i].ToString().Length <= tstr.Length)
              {
                  if (!ar.Contains(tstr))
                  {
                      ar.Insert(i, tstr);
                      inserted = true;
                   }
              }
          }
          if (!inserted && !ar.Contains(tstr))
             ar.Add(tstr);
      }
   }
   StringBuilder sb = new StringBuilder();
   foreach (object o in ar)
       sb.AppendLine(o.ToString());
    myresult.words= sb.ToString();
    return myresult;
}

 

It will work flawlessly (sort of .. :) ), but it will not allow duplication of word. After tinkering for a while, I came up with an idea to improve its performance. A better solution would be to use a dictionary where the length of the word becomes the key. If a key is already exist in the dictionary, we just simply append the word into the value of that particular key. The idea is implemented as follows:

struct Res
{
   //To Record the Result
   public String words;
   public int wordcount;
}

public static Res BetterWordByLengthSort(string raw)
{
   Res myresult = new Res();
   myresult.wordcount = 0;
   myresult.words = "";
   StringBuilder result = new StringBuilder();
   Dictionary myDict = new Dictionary();
   ArrayList keys = new ArrayList();
   string[] words = raw.Split(”n”.ToCharArray());

   raw = “”;
   foreach (string word in words)
   {
      string tword = word.Trim();
      raw += tword + ” “;
   }
   words = null;
   words = raw.Split(” “.ToCharArray());

   foreach (string word in words)
   {
      string tempWord = word.Trim();
      if (tempWord == “”)
         continue;
      int tlength = tempWord.Length;
      if (myDict.ContainsKey(tlength))
      {
         myDict[tlength] = myDict[tlength] + “n” + tempWord;
      }
      else
      {
          keys.Add(tlength);
          myDict.Add(tlength, tempWord);
      }
      myresult.wordcount++;
   }
   //Sort the keys ASC
   keys.Sort();
   for (int i=keys.Count-1; i>=0; i–)
   {
      result.AppendLine(myDict[(int)keys[i]]);
   }
   myresult.words = result.ToString();
   return myresult;
}

I created a GUI project to compare their performance. With same input of 1443 words, the Worst method took 734 ms, while the Better method took only 15 ms. And yes, if you remember your Big O complexity, the Better method is definitely much more efficient compared to the Worst method :)

Apparently no Optimization is needed for DataTable.Select()

Almost losing sleep because of my colleague’s question, I posted the question in .NET Groups where I frequently hang out.

 

One contributor suggested me to use DataTable.Rows.Find(), especially when we are searching by the Index column of that DataTable. I never heard of this, so I keep it noted as an additional advise to my colleague.

 

After much thinking, I somehow became doubting that DataTable.Select() is the actual source of the bottleneck. So this morning I asked her to run the profiler to check the performance of her program. The profiler’s result proven my doubt. The bottleneck was caused by multiple calling of Web Services.

 

All this time I already have a little discomfort with Web Service. I thought the overhead of transmitting data by text XML is too much, especially when you have thousands of records transmitted at an instance. So I spent a little time to googling for opinions that against Web Service (Web Service here refers to those web services that commonly implemented using SOAP). Eventually, I stumbled to this page. I highly recommend it. It’s funny, it’s witty and you might want to use it as an argument when debating against SOAP proponents :)

 

Talking about Profiler, she is using ANTS Profiler. It’s not free :) But you could download the 14-days trial. And of course you can always ask Google for a help.

DataTable.Select Optimization

Today one colleague of mine asking me for tips on improving the DataTable.Select() performance. Apparently she has a data table which contains tens of thousands of records which some of the rows need to be processed together.

This particular question left me dumbfounded and baffled. The only thing that I can suggest were:

  1. Make sure when populating the data table from the database, the data are already sorted
  2. Make sure the filter parameter of the Select() method is selecting by integer data

Come to think of it, I don’t really know how actually the Select() method is done. Is it using Binary Search, Linear Search, Interpolation Seach or any other search method that I never come across with.

If the case is when the data was fetched from database already in order of an ID, let say CustomerID and the DataTable.Select() is using “CustomerID=1001″, is there any way to optimize this further?

I’ll get back to you when I found the answer. Or maybe you have the answer?

Pages (6): « 1 2 [3] 4 5 6 »

Close
E-mail It
Socialized through Gregarious 42