Archiwa tagu: csharp

C# i string contains, equals

Wpis z kategorii – C# dla początkujących.

Tak się składa, że po wielu miesiącach pracy raczej w środowisku javowym, odświeżam sobie C#. Jako że nie do końca ufam swojej pamięci oraz nie uznaję czegoś takiego jak „wiedza teoretyczna” – każdą rzecz muszę doświadczalnie sprawdzić. Programując, często mam otwartą drugą instancję Visuala, w której testuję, czy aby na pewno dana funkcja zachowa się tak, jak podejrzewam. Przeważnie funkcje są grzeczne, a moja pamięć całkiem niezła;) Wolę jednak sprawdzić te drobiazgi, niż potem zastanawiać się, dlaczego mój „produkcyjny” całkiem-duży-kawałek-programu nie działa.

Dziś o stringach w C#, konkretnie o ich porównywaniu i sprawdzaniu, czy string zawiera inny napis.

var part = "this";
var full = "this is some text";
Console.WriteLine(full.Contains(part));//true. Nic nadzwyczajnego. 
// Contains jest wrażliwy na wielkości znaków:
Console.WriteLine(full.ToUpper().Contains(part));//false
Console.WriteLine(full.Contains(part.ToUpper()));//false
Console.WriteLine(full.Contains(part.ToUpperFirstLetter()));//false
Console.WriteLine(full.ToUpperFirstLetter().Contains(part));//false

Metoda ToUpperFirstLetter() to Extension method – jej szkic znalazłam na StackOverflow, a oto pełna implementacja:

public static class Extension
{
  public static string ToUpperFirstLetter(this string value)
  {
    return (string.IsNullOrEmpty(value)) ?
      String.Empty
      : (value.First().ToString().ToUpper() + value.Substring(1));
  }
}

Analogicznie jak Contains zachowuje sie metoda Equals.

Przydatne programy do programowania dla SharePoint

Programując aplikacje pod SharePoint (tudzież po prostu ASP.NET) bardzo przydatnym programem jest aplikacja GacBrowser.

GacBrowser umożliwia nam wyszukiwanie i wyświetlanie assemblies zdeployowanych do GAC (Global Assembly Cache). Instalując np. sharepointowe Web-Party przydatne może być znanie ich GUID’a (unikalnego identyfikatora), a także wersji .NET, dla której zostały skompilowane. Informacja o architekturze dll’ki (np. MSIL) pozwala zlokalizować ją w windowsowych folderach. Dodatkowo można podejrzeć wybrany program w dezasemblerze ILDASM, klikając prawym przyciskiem.

Teoretycznie wszystkie pliki zobaczyć można przechodząc do folderu C:\Windows\assembly lecz w przypadku problemów, szerszą diagnostykę oferuje właśnie wspomniane narzędzie.

Dodawanie referencji do projektu ASP MVC

Przetestowane rozwiązanie (na przykładzie MVC Pager):

1. Zainstalowanie dllki do GAC (za pomocą gacutil.exe).

  • MVC Pager instaluje się do ścieżki:
    C:\Windows\Microsoft.Net\assembly\GAC_MSIL\MvcPagerv4.0_1.5.0.17426__f6872c5a09aed72c\MvcPager.dll
  • Dodatkowo trzeba zmienić nazwę instalowanej dllki na
    MvcPager.dll
  • Polecam narzędzie Gac Browser do przeszukiwania wszystkich zainstalowanych assemblies.

2. Dodanie referencji do projektu Visual Studio.

3. Ustawienie w properties tejże referencji: Copy Local : True

4. Dodanie do View’a (Razor):

@using Webdiyer.WebControls.Mvc

Dziedziczące formy – brak wywoływania eventów?

Mając nastepującą konstrukcję form:

forma nadrzędna -> forma dziedzicząca

trzeba koniecznie pamiętać o InitializeComponents(); w konstruktorze formatki dziedziczącej – brak tej linii powoduje, że wywołują się tylko eventy dopięte do kontrolek formy głównej.

Same eventy można podpinać wielokrotnie – do przycisku może wywoływać się np. najpierw event onClick z formy nadrzędnej, a potem podrzędnej.

Chcąc je jednak nadpisać, funkcję formy nadrzędnej oznaczamy jako virtual, a dziedziczącej – override.

C#: tablica jako bitmapa

Praca z tablicą będącą tak naprawdę bitmapą czarno-białą (lub raczej – w odcieniach szarości): zawierającą współrzędne x, y oraz wartość nasycenia.


Array bmpArr = Array.CreateInstance(typeof(Hue), bmp.Width, bmp.Height);

for (int x = bmpArr.GetLowerBound(0); x <= bmpArr.GetUpperBound(0); x++)
{
  for (int y = bmpArr.GetLowerBound(1); y <= bmpArr.GetUpperBound(1); y++)
  {
    int rgb = csrgb(bmp.GetPixel(x, y).R, bmp.GetPixel(x, y).G, bmp.GetPixel(x, y).B); //bmpArr.SetValue("abc" + x + y, x, y);
    Hue h = new Hue(csred(rgb), csgreen(rgb), csblue(rgb));
    bmpArr.SetValue(h, x, y);
  }
}

Kopiowanie tablic dwuwymiarowych

Kopiowanie obiektów nie jest rzeczą tak oczywistą, jak mogłoby się wydawać. Zanim zapomnę, jak to było, zanotuję sobie kilka użytecznych fragmentów kodu (C#) 🙂

//ręczne kopiowanie:
byte[,] oryginalna = new byte[2, 1];
byte[,] skopiowana = new byte[oryginalna.GetLength(0), oryginalna.GetLength(1)];

oryginalna[0, 0] = 0;
oryginalna[1, 0] = 1;

//kopiowanie przez Array.Copy - odnosi się do już istniejących tablic.
//składnia: Array.Copy(źródło danych, cel danych, długość);
Array.Copy(oryginalna, skopiowana, oryginalna.Length);

//Gdy przy klonowaniu tworzymy nową tablicę:
byte[,] sklonowana = (byte[,])oryginalna.Clone();

Nawet pomimo zmiany elementów tablicy oryginalnej, elementy tablicy skopiowanej (lub sklonowanej) nie ulegną zmianie – gdyż tablica „bytów”;) zawiera elementy proste, a nie referencje (referencje, czyli nie np. obiekt innej klasy).

Dobrze wytłumaczone jest to tu: http://arvangen.wordpress.com/2011/02/18/c-plytkie-i-glebokie-kopie-obiektow-wprowadzenie/oraz tu: http://www.csharp411.com/c-object-clone-wars/, więc nie będę się powtarzać;)

Parsowanie int w C#

Dziś krótki fragment kodu odnośnie parsowania liczb całkowitych w C#. Stringa do inta parsować można na dwa sposoby:

  • Parse – zgłasza wyjątek, gdy parsowanie nie powiedzie się
  • TryParse – próbuje sparsować, jeśli się nie powiedzie, zwraca false.

string text = "3";
int number;
if(int.TryParse(text, out number) == false)
  number = -1;

C#: wypełnianie i wyświetlanie tablic

Wypełnianie tablic i wyświetlanie ich zawartości – w języku C#. Oto kod:

using System;

namespace testTablic
{
    class Program
    {
        static void Wypelnij(int[,] tab, int czym)
        {
            for (int i = 0; i < tab.GetLength(0); i++)
            {
                for (int j = 0; j < tab.GetLength(1); j++)
                {
                    tab[i, j] = czym;
                }
            }
        }

        static void Wyswietl(int[,] tab)
        {
            for (int i = 0; i < tab.GetLength(0); i++)
            {
                for (int j = 0; j < tab.GetLength(1); j++)
                {
                    Console.Write(tab[i, j]+" ");
                }
                Console.WriteLine();
            }
        }

        static void Main(string[] args)
        {
            int[,] szostki = new int[3, 2];
            int[,] H = new int[3, 2];

            Wypelnij(szostki, 6);
            Wypelnij(H,8);

            Console.WriteLine("Tablica H (czyli same 8)");
            Wyswietl(H);

            H = szostki;

            Console.WriteLine("Tablica H (czyli same 6)");
            Wyswietl(H);

            szostki[0, 0] = 1;

            Console.WriteLine("Tablica H (powinny byc same 6)");
            Wyswietl(H);

            Console.Read();
        }
    }
}