regular expressions (regex) - справочник

[abc]
Один символ: a, b или c
A single character of: a, b or c
[^abc] Любой символ, за исключением: a, b или c Any single character except: a, b or c
[a-z] Любой одиночный символ из диапазона a-z Any single character in the range a-z
[a-zA-Z] Любой символ в диапазоне a-z или A-Z Any single character in the range a-z or A-Z
^ Начало строки Start of string
$ Конец строки End of string
. Любой символ Any single character
\s Любой символ пробела Any whitespace character
\S Непробельного характера Any non-whitespace character
\d Любая цифра Any digit
\D Любой не-цифа Any non-digit
\w Любое слово, символ (буква, цифра, подчеркивание) Any word character (letter, number, underscore)
\W Любой не символ слова Any non-word character
\b Граница слова A word boundary
\B Инверсными границе слова Negated word boundary
(...) Захватить все закрытые Capture everything enclosed
(a|b) a или b a or b
a? Ноль или один из Zero or one of a
a* Нуль или больше Zero or more of a
a+ Один или несколько One or more of a
a{3} Ровно 3 из Exactly 3 of a
a{3,} 3 или более 3 or more of a
a{3,6} Между 3 и 6 Between 3 and 6 of a
(?:...)
Номера для группы захвата Non-capturing group
(?>...) Атомной группы (не отступать) Atomic group (does not backtrack)
(?|...) Дубликат подшаблоном группы. Duplicate subpattern group.
(?#...) комментировать Comment
(?'name'...) Именованные группы захвата Named capturing group
(?<name>...) Именованные группы захвата Named capturing group
(?P<name>...) Именованные группы захвата Named capturing group
(?JismxXU) Встроенные модификаторы Inline modifiers
(?(...)..|..) Условный (IF) заявление Conditional (IF) statement
(?R) Recurse всей картины Recurse the entire pattern
(?1) Recurse первый подшаблоном Recurse the first subpattern
(?=...) Положительный просмотр вперед Positive Lookahead
(?<=...) Положительный просмотр назад Positive Lookbehind
(?!...) Отрицательный просмотр вперед Negative Lookahead
(?<!...) Отрицательный просмотр назад Negative Lookbehind
(*...) Глаголы Verbs
\A Начало строки Start of string
\G Специальные якорь, полезные с / г Special anchor, useful with /g
\p{..} or \p.. Свойств символов Юникод Unicode character properties
\z Конец строки End of string
[abc]* 0 или более, В и С [жадный] 0 or more of a, b or c [greedy]
[abc]*+ 0 или более, В или С [притяжательные] 0 or more of a, b or c [possessive]
[abc]*? Ноль или более из A, B или C [ленивый] Zero or more of a, b or c [lazy]
\Q...\E Цитата; Рассматривать как литералы Quote; Treat as literals
[[:alnum:]] Posix стиле символ класса Posix style char class
     
     
     
flags: i: case insensitive m: make ^$ match start and end of line respectively s: make dot match newlines g: all matches
Флаги: i : без учета регистра m : сделайте ^ $ начала матча и в конце строки соответственно s : сделать перевод строки точка матч g : Все матчи

http://msdn.microsoft.com/ru-ru/library/az24scfc.aspx

http://regex101.com/

XNA прямая загрузка контента

В XNA (и в MonoGame) можно загружать контентна прямую

Texture2D  myTexture;
System.IO.Stream stream = TitleContainer.OpenStream("Content/picture.jpg");
myTexture = Texture2D.FromStream(GraphicsDevice, stream);

LINQ vs foreach измерение скорости работы

Я вспомнил что давно хотел прояснить для себя вопрос, насколько использование LINQ быстрее/медленнее циклов.
Оказалось, к моему сожалению что медленнее, а массивы оказались быстрее листов.
Немного вступления. Когда появился LINQ он показался мне чем-то страшным и только для работы с базами данных. Через некоторое время я полюбил его. В самом деле, писать типизированные запросы к базе данных на нам настоящее удовольствие. И так постепенно он плотно вошел в мою жизнь. Я забыл все алгоритмы сортировки и поиска и полностью стал использовать LINQ. Но никогда не задумывался, а насколько быстро он работает. И вот вечером, после прочтения статьи о том что массивы быстрее листов (я думал на оборот) я решил проверить.
Для этого быстро написал код, коллекции и массивы я решил заполнять случайными значениями, при старте приложения. Размер массивов/списков 10000000 элементов. Замеры я делал на релизном билде с отпимизацией (.net4.5).
Ну что, начнем, для начала строки:

var result = stringList.Where(w => w.Contains("ab")).ToList();

против

var result = new List<string>();
            foreach (var item in stringList)
            {
                if (item.Contains("ab"))
                {
                    result.Add(item); 
                }
            }

И что в результате?
3480 мс. против 2360 мс. 
А если в место листов используются массивы то 2542 мс. против 2122 мс.
Да, вот так, почти секунда разницы. Как вы понимаете LINQ проиграл, так же, как и листы.
Грубо говоря мы теряем 35% производительности на LINQ запросах.
На массивах мы теряем всего 15% на LINQ запросах.

Теперь числа:

var result = intList.Where(w => w > 300 && w < 1000).ToList();

против

var result = new List<int>();
            foreach (var item in intList)
            {
                if (item > 300 && item < 1000)
                {
                    result.Add(item);
                }
            }

314 мс. против 184 мс. и 188 против 165 для массивов. Ну чтож, опять LINQ проиграл. Причем разница уже в 42% для листов и 13% для массивов.
Последняя надежда остаётся FirstOrDefault() может сейчас вырваться вперед?

var result = intList.Where(w => w > 300 && w < 5000).FirstOrDefault();

против

int result = 0;
            foreach (var item in intList)
            {
                if (item > 300 && item < 5000)
                {
                    result = item;
                    break;
                }
            }

51 и 45 мс. в этот раз 22%, и  foreach опять победил.

Я запускал несколько раз приложение, и результат всегда был одинаковый от 20% до 45% процентов увеличение времени выполнения по сравнению с foreach.
Интересно, чем обусловлено такое поведение? Я думаю, что лишнее время тратиться на создания дерева выражений, и возможно какие-то еще функции.
Вот так, за красивый и хорошо читаемый код нам приходиться расплачиваться скоростью работы. С другой стороны в обычных приложениях несколько десятков миллисекунд задержки будут не критичны, но в высоконагруженных проектах это может стать большой проблемой.

 

 

WCF сервис и клиент, запуск и создание программно

Сервер:

Uri baseAddress = new Uri(string.Format("net.tcp://127.0.0.1:{0}/ MyService", port));
ServiceHost serviceHost = new ServiceHost(typeof(MyService));

serviceHost.AddServiceEndpoint(typeof(IMyService),
	new NetTcpBinding(),
	baseAddress);

serviceHost.Open();

Клиент:

var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("http://localhost/myservice");
var myChannelFactory = new ChannelFactory<IMyService>(myBinding, myEndpoint);

IMyService client = null;

try
{
    client = myChannelFactory.CreateChannel();
    client.MyServiceOperation();
    ((ICommunicationObject)client).Close();
}
catch
{
    if (client != null)
    {
        ((ICommunicationObject)client).Abort();
    }
}

Как получить доступ к private полю класса из вне

Иногда нужно получить доступ к private полям класса, а у вас нет возможности модифицировать класс.
Это можно сделать так:

static void Main(string[] args)
{
    PrivateClass myPrivateClass = new PrivateClass();
 
    // input from ToString() at the beginning to see the content
    Console.WriteLine(myPrivateClass);
 
    FieldInfo fi = typeof(PrivateClass).GetField("_privateText", BindingFlags.NonPublic | BindingFlags.Instance);
    String valueFromPrivateField = fi.GetValue(myPrivateClass).ToString();
    Console.WriteLine("And this was read with reflection: {0}", valueFromPrivateField);
}
static void Main(string[] args)
{
    PrivateClass myPrivateClass = new PrivateClass();
 
    // input from ToString() at the beginning
    Console.WriteLine(myPrivateClass);
 
    FieldInfo fi = typeof(PrivateClass).GetField("_privateText", BindingFlags.NonPublic | BindingFlags.Instance);
    fi.SetValue(myPrivateClass, "but I''m going to change you!");
    Console.WriteLine(myPrivateClass);
}



ссылка: http://nubo-corp.com/patrick-lamber/2010/07/how-do-i-access-private-methods-properties-and-member-variable-not-controlled-by-me-in-c/

Настройка Windows Service – доступ к рабочему столу

Для этого сервис должен быть запущен он локальный учетной записи, и в инсталлере нужно прописать вот так:

[RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            this.InitializeComponent();
        }

        protected override void OnCommitted(IDictionary savedState)
        {
            base.OnCommitted(savedState);

            using (RegistryKey ckey =
                Registry.LocalMachine.OpenSubKey(string.Format(@"SYSTEM\CurrentControlSet\Services\{0}", "YOURSERVICENAME"), true))
            {
                if (ckey != null && ckey.GetValue("Type") != null)
                {
                    ckey.SetValue("Type", (((int)ckey.GetValue("Type")) | 256));
                }
            }
        }
    }

Ссылка http://stackoverflow.com/questions/1945529/how-can-i-configure-my-windows-service-in-the-code-to-access-the-desktop

C# 8 способов создать поток

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (ob, se) => 
{
	//работа потока
	int a = 5;
};
bw.RunWorkerAsync();
System.Threading.Thread newThread;
newThread = new System.Threading.Thread(() => 
{
	//работа потока
	int a = 5;
});
newThread.Start();
new System.Threading.Thread(() => 
{
	//работа потока
	int a = 5;
}).Start();
ThreadPool.QueueUserWorkItem((obj) => 
{ 
	//работа потока
	int a = 5;
});
Parallel.Invoke(() => 
{ 
	//работа потока
	int a = 5;
});
Task.Run(() =>
{
	//работа потока
	int a = 5;
});
Task t1 = new Task(() => 
{
	//работа потока
	int a = 5;
});
t1.Start();
Task t2 = Task.Factory.StartNew(() => 
{
	//работа потока
	int a = 5;
});
t2.Wait();

Включить Gzip сжатие в ASP.NET и web.config

 <system.webServer>
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
      <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
      <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/xml" enabled="true" />
        <add mimeType="application/atom" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/soap+xml" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </dynamicTypes>
      <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/xml" enabled="true" />
        <add mimeType="application/atom" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/soap+xml" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </staticTypes>
    </httpCompression>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
  </system.webServer>

Для настройки IIS  http://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx