Łączenie łańcuchów znakowych w C#

by Piotrosz 27. January 2009
W celu łączenia łańcuchów znakowych lepiej jest używać StringBuilder zamiast operatora '+'. Robienie czegoś takiego jak Label1.Text += "Napis"; jest bardzo kosztowne.
class Program
{
  static void Main(string[] args)
  {
    int IloscIteracji = 100000;
    DateTime dtFrom = new DateTime();
    TimeSpan PomiarCzasu = new TimeSpan();

    dtFrom = DateTime.Now;
    string Test1 = "";
    for (int i = 0; i < IloscIteracji; i++)
    {
      Test1 += "A";
    }
    PomiarCzasu = DateTime.Now - dtFrom;
    Console.WriteLine("Pierwsza operacja trwała: {0} sekund(y) i {1} milisekund", PomiarCzasu.Seconds, PomiarCzasu.Milliseconds);

    dtFrom = DateTime.Now;
    StringBuilder sbTest = new StringBuilder();
    for (int i = 0; i < IloscIteracji; i++)
    {
      sbTest.Append("A");
    }
    PomiarCzasu = DateTime.Now - dtFrom;
    Console.WriteLine("Pierwsza operacja trwała: {0} sekund(y) i {1} milisekund", PomiarCzasu.Seconds, PomiarCzasu.Milliseconds);
  }
}

Wyrównanie napisów w Console.WriteLine i Console.Write

by Piotrosz 26. January 2009
Wyrównanie napisów wyrzucanych na konsolę do lewej i do prawej:
class Program
{
  // Funkcja zwracająca losowe słowo złożone z małych liter
  static string GetRandWord(int size, Random random)
  {
    StringBuilder sbRandWord = new StringBuilder();
    for (int i = 0; i < size; i++)
      sbRandWord.Append(Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 97))));
    return sbRandWord.ToString();
  }

  static void Main(string[] args)
  {
    Random r = new Random();
    // Pierwsza kolumna będzie wyrównana do prawej, a druga do lewej
    // Każda z kolumn zajmuje 20 znaków
    for (int i = 0; i < 10; i++)
      Console.WriteLine("{0,20} {1,-20}", GetRandWord(r.Next(0, 20), r), GetRandWord(r.Next(0, 20), r));            
  }
}
Wynik działania programu:

Zapytania LINQ: proste przykłady

by Piotrosz 17. January 2009
Dość długi przykład z różnymi podstawowymi zapytaniami LINQ:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_5
{
    class Program
    {
        // Przykładowe zbiory danych
        private static int[] Liczby1 = new int[] { 10, 2, 3, 56, 101, 23, 2, 8, 9, 10, 5 };
        private static int[] Liczby2 = new int[] { 2, 4, 6, 7, 2, 3, 7 };
        private static string[] Nazwy = { "Sun", "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", 

"Neptune", "Pluto" };

        public static void Linq_Where1()
        {
            // Wybranie liczb mniejszych od 10
            var MniejszeOd10 = from n in Liczby1
                              where n < 10
                              select n;
            Console.WriteLine("\nLiczby mniejsze od 10: ");
            foreach (var liczba in MniejszeOd10)
            {
                Console.Write("{0} ", liczba);
            }
        }

        public static void Linq_Where2()
        {
            var O2WiekszeParzyste = from p in Liczby1
                                    where p % 2 == 0
                                    select p + 2;
            Console.WriteLine("\nLiczby parzyste zwiększone o 2:");
            foreach (var liczba in O2WiekszeParzyste)
            {
                Console.Write("{0} ", liczba);
            }
        }

        public static void Linq_WhereAnonymous()
        {
            var words = from n in Nazwy
                        where n.EndsWith("s")
                        select new { Lower = n.ToLower(), Upper = n.ToUpper() };
            Console.WriteLine("\nSłowa kończące się na 's' małymi i dużymi literami:");
            foreach (var word in words)
            {
                Console.Write(word.Lower);
                Console.Write(word.Upper);
            }
        }

        public static void Linq_DoubleFrom()
        {
            var pairs = from n1 in Liczby1
                        from n2 in Liczby2
                        where n1 < n2 && n2 % 2 == 0
                        select new { n1, n2 };

            Console.WriteLine("\nPary liczb (n1, n2) takie, że n1 < n2 i n2 parzyste: ");
            foreach (var pair in pairs)
            {
                Console.Write("({0},{1}) ", pair.n1, pair.n2);
            }
        }

        public static void Linq_Take1()
        {
            var Taken = (from n1 in Liczby1
                         select n1).Take(3);
            Console.WriteLine("\nPierwsze 3 liczby:");
            foreach (var liczba in Taken)
            {
                Console.Write("{0} ", liczba);
            }
        }

        public static void Linq_Orderby1()
        {
            var WordsOrdered = from ww in Nazwy
                               orderby ww descending // po przecinku dalsze uporządkowania
                               select ww;
            Console.WriteLine("\nSłowa uporządkowane malejąco:");
            foreach (var word in WordsOrdered)
            {
                Console.Write("{0} ", word);
            }
        }

        public static void Linq_Group1()
        {
            var numberGroups =
                from n in Liczby1
                group n by n % 5 into g
                select new { Remainder = g.Key, Numbers = g };

            foreach (var g in numberGroups)
            {
                Console.WriteLine("\nLiczby, które po podzieleniu przez 5 dają resztę równą: {0}", g.Remainder);
                foreach (var n in g.Numbers)
                {
                    Console.Write("{0} ", n);
                }
            }
        }

        public static void Linq_Group2()
        {
            var wordGroups =
                from w in Nazwy
                group w by w[0] into g
                select new { FirstLetter = g.Key, Words = g };

            foreach (var g in wordGroups)
            {
                Console.WriteLine("\nSłowa, które zaczynają się na literę: '{0}'", g.FirstLetter);
                foreach (var w in g.Words)
                {
                    Console.Write("{0} ", w);
                }
            }
        }

        public static void Linq_Union1()
        {
            var uniqueNumbers = Liczby1.Union(Liczby2);
            Console.WriteLine("\nUnikalne liczby które są w obu zbiorach:");
            foreach (var n in uniqueNumbers)
            {
                Console.Write("{0} ", n);
            }
        }

        public static void Linq_Intersect1()
        {
            var commonNumbers = Liczby1.Intersect(Liczby2);

            Console.WriteLine("\nLiczby występujące w dwóch zbiorach:");
            foreach (var n in commonNumbers)
            {
                Console.Write("{0} ", n);
            }
        }

        public static void Linq_Except1()
        {
            IEnumerable aOnlyNumbers = Liczby1.Except(Liczby2);

            Console.WriteLine("\nLiczby z pierwszego zbioru, które nie występują w drugim zbiorze:");
            foreach (var n in aOnlyNumbers)
            {
                Console.Write("{0} ", n);
            }
        }

        public static void Linq_ToDictionary1()
        {
            var pisarze = new[] { new {Autor = "Pynchon", IloscKsiazek = 6},
                                new {Autor = "London" , IloscKsiazek = 15},
                                new {Autor = "Beckett", IloscKsiazek = 17}
                              };
            var pisarzeDict = pisarze.ToDictionary(sr => sr.Autor);
            Console.WriteLine("\nKonwersja przy użyciu ToDictionary():");
            Console.Write(pisarzeDict["London"]);
        }

        public static void Linq_Join1()
        {
            var liczby = from n1 in Liczby1
                         join n2 in Liczby2 on n1 equals n2
                         select n1;
            Console.WriteLine("\nBardzo prosty przykład z join:");
            foreach (var liczba in liczby)
            {
                Console.Write("{0} ", liczba);
            }
        }

        static void Main(string[] args)
        {
            Linq_Where1();
            Linq_Where2();
            Linq_WhereAnonymous();
            Linq_DoubleFrom();
            Linq_Take1(); //inne podobne operatory: Skip, Take, TakeWhile, SkipWhile
            Linq_Orderby1();
            Linq_Group1();
            Linq_Group2();
            Linq_Union1();
            Linq_Intersect1();
            Linq_Except1();
            Linq_ToDictionary1(); //inne podobne operatory: To array, To list
            Linq_Join1();
        }
    } 
}

Atrybut AutoEventWireup

by Piotrosz 12. January 2009
Przykład wyjaśniający działanie atrybutu AutoEventWireup w dyrektywie <%@Page na stronie aspx. Domyślnie atrybut ten ustawiony jest na true. Oznacza to, że wszystkie zdarzenia strony jak na przykład Page_Load, Page_Init, etc. są uruchamiane automatycznie. Na przykład dyrektywa @Page wygląda domyślnie tak:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
W pliku code-behind dodajemy metodę Page_Load():
protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = "executing Page_Load method";
}
Po odpaleniu strony w Label1 pokazuje się komunikat, który oznacza, że metoda Page_Load() się wykonała.
Po ustawieniu atrybutu AutoEventWireup na false metoda Page_Load() nie wykona się. Chyba, że napisze się tak:
<%@ Page Language="C#" AutoEventWireup="false" CodeFile="Default.aspx.cs" Inherits="_Default" %>
(czyli AutoEventWireup jest na false), a w tagu form doda się atrybut onload:
<form id="form1" runat="server" onload="Page_Load">
</form>
Wtedy znowu metoda Page_Load wykona się.

Monitorowanie aplikacji WWW - powiadomienie poprzez e-mail

by Piotrosz 9. January 2009
Należy dodać sekcję <healthMonitoring> w Web.config.
Podsekcje sekcji <healthMonitoring> to:
<bufferModes> - konfiguracja przesyłania wydarzeń w paczkach (buforowanie często powatarzających się zdarzeń).
<providers> - konfiguracja providerów, n.p. EventLogWebEventProvider, SqlWebEventProvider, WmiWebEventProvider, SimpleMailWebEventProvider.
<profiles> - ile zdarzeń może zajść w określonym przedziale czasu.
<rules> - wiąże typy zdarzeń z providerami.
<eventMappings> - wiąże nazwy zdarzeń z klasami, które je implementują.
Przykład:
Plik Web.config:

    
        
            
        
    



  
    
  
  
    
  

Po odpaleniu aplikacji (CTRL+F5) przychodzi pierwszy mail:

Tworzenie Web Setup Project

by Piotrosz 8. January 2009
Tworzenie Web Setup Project krok po kroku:
  1. Otwieramy Solution ze stroną dla której chcemy stworzyć Web Setup Project. Wybieramy File -> Add -> New Project.
  2. Wybieramy Web Setup Project.
  3. W przeglądarce systemu plików (File System Editor), prawy przycisk myszy na folder Web Application i -> Add -> Project Output
  4. W okienku dialogowym Add Project Output Group zaznaczyć Content Files i OK.
  5. Po wybraniu Build tworzony jest plik .msi w katalogu Visual Studio 2005\Projects. (W podfolderze Debug bądź Release w zależności od ustawień w Configuration Managerze).
Konfigurowanie dodatkowych rzeczy:

LAUNCH CONDITIONS:
Aby dodać launch conditions należy wybrać w Solution Explorer projektu:

Po dodaniu wygląda Launch Conditions Editor wygląda tak:


Widać dwie gałęzie:
Search Target Machine - rzeczy, które muszą się znaleźć na maszynie docelowej przed instalacją. Domyślnie jest Search For IIS. Można też wyszukiwać pliki, wpisy w rejestrze i Windows Installer.
Launch Conditions - warunki, które muszą być spełnione przed instalacją. Warunki te bazują na warunkach wyszukiwania lub innych kryteriach (n.p. wersja systemu operacyjnego). Wyświetla przyjazny komunikat, jeżeli warunek nie zostanie spełniony.
Jeżeli chcemy dodać warunek istnienia określonego pliku należy:
  • Dodać wyszukiwanie (tutaj wyszukiwanie pliku z czcionką):
  • Ustawić właściwości wyszukiwania:
  • Ustawić właściwości Launch Condition związanego z dodanym wcześniej wyszukiwaniem (właściwośc Condition musi wskazywać na wcześniej stworzone wyszukiwanie tj. FILEEXISTS1):

DODAWANIE DODATKOWYCH KROKÓW W KREATORZE
  1. View -> Add -> User Interface
  2. Po dodaniu wygląda to tak (jest to User Interface Editor):
  3. Po kliknięciu na Add Dialog z menu kontektowego są do wyboru różne szablony.
W podobny sposób można dodawać inne warunki i wpisy do rejestru systemowego.

Zamiana strony na kontrolkę Web User Control

by Piotrosz 1. January 2009
Jak zamienić stronę aspx w kontrolkę Web User Control?
  1. .aspx -> .ascx (Zmiana rozszerzenia pliku),
  2. <html>, <body> (Usunięcie znaczników html i body),
  3. @Page -> @Control (Zmiana dyrektywy na początku strony),
  4. Usunięcie wszystkich atrybutów znacznika @Control oprócz Language, AutoEventWireUp, CodeFile i Inherits,
  5. Dodanie atrybutu className='Nazwa' do dyrektywy @Control (By kontrolka mogła być silnie typowana).

Tags:

ASP.NET

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen