Параметры функции C# .ToString()

Перевод чисел в денежную валюту (Currency). Результат зависит от региональных настроек операционной системы: 

double number1 = 45.7;
string currency1 = number1.ToString("c"); // Значение: 47,70р. или $47.70 и т.д.
double number2 = 45.74;
string currency2 = number2.ToString("c3"); // Значение: 45.745р. или $47.745 и т.д.


 Отображение разрядов у целочисленного числа (Digital)

int number = 45;
string digits = number.ToString("d"); // Значение: "45"         
int number2 = -136;
string digits2 = number2.ToString("d6"); // Значение: "-000136"


 

Отображение чисел после плавающей точки (Fixed-point)

double number1 = 45.123;
string float1 = number1.ToString("f"); // Значение: "45,12" (рус) 
double number2 = -45.1;s
tring float2 = number2.ToString("f3"); // Значение: "-45,100" (рус)


 

Отображение разделителей групп (Number)

double number = -55645.1;
string group = number.ToString("n"); // Значение: "-55 645,10" (рус)


 

Отображение процентов (Percent) 
 

double number1 = 0.45;
string percent1 = number1.ToString("p"); // Значение: "45,00%" (рус) 
double number2 = -0.451;
string percent2 = number2.ToString("p1"); // Значение: "-45,1%" (рус)


 

Отображение целочисленного значения в 16-разрядной системе (Hexademal)

 

int number1 = 255;
string hex1 = number1.ToString("x"); // Значение: "ff" 
int number2 = 255;
string hex2 = number2.ToString("X"); // Значение: "FF" 
int number3 = 255;
string hex3 = number3.ToString("X8"); // Значение: "000000FF"

Кроме этого можно управлять форматом чисел:

i.ToString("00");

 Это значит что  например чило "5" будет представлено как "05".

 

 Таблица с MSDN в которой представлены форматы: 

Описатель формата

Имя

Описание

Примеры

"0"

Знак-заместитель нуля

Заменяет ноль соответствующей цифрой, если такая имеется. В противном случае в результирующей строке будет стоять ноль.

Дополнительные сведения: Настраиваемый описатель "0".

1234.5678 ("00000") -> 01235

0.45678 ("0.00", en-US) -> 0.46

0.45678 ("0.00", fr-FR) -> 0,46

"#"

Заместитель цифры

Заменяет знак "#" соответствующей цифрой, если такая имеется. В противном случае в результирующей строке цифра стоять не будет.

Дополнительные сведения: Настраиваемый описатель "#".

1234.5678 ("#####") -> 1235

0.45678 ("#.##", en-US) -> .46

0.45678 ("#.##", fr-FR) -> ,46

"."

Разделитель

Определяет расположение разделителя целой и дробной частей в результирующей строке.

Дополнительные сведения см. в разделе Настраиваемый описатель ".".

0.45678 ("0.00", en-US) -> 0.46

0.45678 ("0.00", fr-FR) -> 0,46

","

Разделитель групп и масштабирование чисел

Служит в качестве описателя разделителя групп и описателя масштабирования чисел. В качестве разделителя групп вставляет локализованный символ-разделитель групп между всеми группами. В качестве описателя масштабирования чисел делит число на 1000 для всех указанных запятых.

Дополнительные сведения: Настраиваемый описатель ",".

Описатель разделителя групп:

2147483647 ("##,#", en-US) -> 2,147,483,647

2147483647 ("##,#", es-ES) -> 2.147.483.647

Описатель масштабирования:

2147483647 ("#,#,,", en-US) -> 2,147

2147483647 ("#,#,,", es-ES) -> 2.147

"%"

Заместитель процентов

Умножает число на 100 и вставляет локализованный символ процента в результирующую строку.

Дополнительные сведения: Настраиваемый описатель "%".

0.3697 ("%#0.00", en-US) -> %36.97

0.3697 ("%#0.00", el-GR) -> %36,97

0.3697 ("##.0 %", en-US) -> 37.0 %

0.3697 ("##.0 %", el-GR) -> 37,0 %

"‰"

Местозаполнитель промилле

Умножает число на 1000 и вставляет локализованный символ промилле в результирующую строку.

Дополнительные сведения: Настраиваемый описатель "‰".

0.03697 ("#0.00‰", en-US) -> 36.97‰

0.03697 ("#0.00‰", ru-RU) -> 36,97‰

"E0"

"E+0"

"E-0"

"e0"

"e+0"

"e-0"

Экспоненциальная нотация

Если за этим описателем следует по меньшей мере один ноль (0), результат форматируется с использованием экспоненциальной нотации. Регистр ("E" или "e") определяет регистр символа экспоненты в результирующей строке. Минимальное число цифр экспоненты определяется количеством нулей, стоящих за символом "E" или "e". Знак "+" указывает на то, что перед экспонентой всегда должен ставиться символ знака. Знак "-" указывает на то, что символ знака должен ставиться только в случае, если экспонента имеет отрицательное значение.

Дополнительные сведения: Настраиваемые описатели "E" и "e".

987654 ("#0.0e0") -> 98.8e4

1503.92311 ("0.0##e+00") -> 1.504e+03

1.8901385E-16 ("0.0e+00") -> 1.9e-16

\

Escape-символ

Указывает на то, что следующий за ним символ должен рассматриваться как литерал, а не как описатель настраиваемого формата.

Дополнительные сведения: Escape-символ "\".

987654 ("\###00\#") -> #987654#

'строка'

"строка"

Разделитель строк-литералов

Указывает на то, что заключенные в разделители символы должны быть скопированы в результирующую строку без изменений.

68 ("# ' градусов'") -> 68 градусов

68 ("#' градусов'") -> 68 градусов

;

Разделитель секций

Определяет секции с раздельными строками формата для положительных чисел, отрицательных чисел и нуля.

Дополнительные сведения: Разделитель секций ";".

12.345 ("#0.0#;(#0.0#);-\0-") -> 12.35

0 ("#0.0#;(#0.0#);-\0-") -> -0-

-12.345 ("#0.0#;(#0.0#);-\0-") -> (12.35)

12.345 ("#0.0#;(#0.0#)") -> 12.35

0 ("#0.0#;(#0.0#)") -> 0.0

-12.345 ("#0.0#;(#0.0#)") -> (12.35)

Другой

Все остальные символы

Символ копируется в результирующую строку без изменений.

68 ("# °") -> 68 °


 

 Подробнее:

http://msdn.microsoft.com/ru-ru/library/0c899ak8.aspx

http://dotnetways.com/sharpbook/tostring/

 

Как получить и обработать UnhandledException

Иногда в вашем приложении может возникнуть необработанное исключение, которое приведет к краху приложения.
Для этого нужно подписаться на UnhandledException


Для WPF, Silverlight и подобных:

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName assemName = assem.GetName();
Exception e = (Exception)args.ExceptionObject;
//необходимые действия
}

Для ASP.NET в фале Global.asax:

protected void Application_Error(Object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName assemName = assem.GetName();
//необходимые действияServer.ClearError();
}

Стоит заметить, что Application_Error вызывается в случае любой ошибки, в том числе когда нет нужной страницы и т.п.

Как получить IP клиента в WCF Service

Чтобы получить IP подключенного клиента нужно сделать:

 

OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty = 
messageProperties[RemoteEndpointMessageProperty.Name] 
as RemoteEndpointMessageProperty;
String ClientIP = endpointProperty.Address;

Динамическое создание переменных в C# и работы с ними.

Получение списка классов в сборке:
Тут мы получаем список классов в интересущем нас пространстве имен, можно также указать конкретный класс, или что либо еще.

String namespace = "ClassLibrary1.SomeNamspace";
var  library = (AppDomain.CurrentDomain.GetAssemblies().
Where(w => w.FullName.Contains(namespace)))

 Получение списка полей в классе:
Тип свойства можно указывать, скажем мы хотим получить публичные свойства.

Type type = library.GetType("ClassName");
PropertyInfo[] properties = 
type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (PropertyInfo property in properties)
{
string propertyName = property.Name;
}

 Создание динамической переменной:

var currentType = (from i in library.GetTypes()
where i.FullName.Contains("CurrentClassName")
select i).FirstOrDefault();
var variable = Activator.CreateInstance(currentType); //создали перменную

 Записать данные в переменную:

currentType.GetProperty("ClassPropertyName").
SetValue(variable, "Новое значение свойства", null);

 Взять данные из переменной:

string getProperty = (string)currentType.GetProperty("ClassProperyName").
GetValue(variable, null);

Бинарная сериализция и десерилазиция обьтектов C#

Сериализация:

BinaryFormatter serializer = new BinaryFormatter();
using (MemoryStream s = new MemoryStream())
{
serializer.Serialize(s, ИМЯ_ПЕРЕМЕННОЙ_ДЛЯ_СЕРИАЛИЗАЦИИ);
s.ToArray();// получили сериалзиованный массив.
}

Десириализация:

BinaryFormatter serializer = new BinaryFormatter();
using (MemoryStream s = new MemoryStream(ИМЯ_ПЕРЕМЕННОЙ_ДЛЯ_ДЕСЕРИАЛИЗАЦИИ))
{
var newVariable = serializer.Deserialize(s); //создали переменную
}

C# Func<>

Общий вид таков Func<Входящий_тип, Возвращаемый_тип>((Имя_переменной_входящего_типа)=>{ реализация });

Результат можно присваивать переменным как во втором примере, или сначала делать делегат, а потом его использовать, как в первом примере.

Параметр передаеться через Invoke.

 

Пример 1:

var buildfunc = new Func<IList<SiteStructure>, string>( 
(lst) =>
{
string str = "|";
foreach (var item in lst)
{
str += item.Name;
}
return str + "|";
});
var lCurrentTemplate = from j in lModel.Templates
select new
{
ID = j.ID,
Name = j.Name,
ClassName = j.ClassName,
LastChange = j.LastChange,
NameSection = buildfunc.Invoke(j.SiteStructures)
};

 

Пример 2:

       

int a = new Func<string,int>((str) =>
{ 
int ret = 0;
if (int.TryParse(str, out ret))
{
return ret;
}
else
{
return -1;
}
}).Invoke("3");

 

C# wpf настройка формата даты для приложения

Например: 

CultureInfo ci = new CultureInfo("ru-RU");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

А чтобы получить культуру:

var culture = new CultureInfo
(Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName);

Или можно сделать так:

public MainWindow()
{
InitializeComponent();
this.Language = XmlLanguage.GetLanguage(
CultureInfo.CurrentCulture.IetfLanguageTag);
}

Счетчики производительности PerformanceCounter в C#

Важное замечание, чтобы счетчики давали правдивые результаты их нужно объявить один раз и после этого к ним обращаться скажем по таймеру. Если вы будете постоянно создавать заново счетчики то они будут возвращать значение – 0. Так как им нужно время для сбора данных.
Я приведу пример четырех счетчиков: Процессора, памяти, файла подкачки и сети.

 

public partial class MainWindow : Window
{
PerformanceCounter cpuUsage;
PerformanceCounter memUsage;
PerformanceCounter pageUsage;
List<PerformanceCounter> netUsage = null;
System.Timers.Timer tmr;
public MainWindow()
{
InitializeComponent();
cpuUsage = new PerformanceCounter("Processor", "% Processor Time", "_Total");
memUsage = new PerformanceCounter("Memory", "Available MBytes");
netUsage = GetNetCounters();
pageUsage = new PerformanceCounter("Paging File", "% Usage", "_Total");
tmr = new System.Timers.Timer();
tmr.Elapsed += tmr_Elapsed;
tmr.Interval = 1000;
tmr.Start();
}
void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
cont.Children.Clear();
cont.Children.Add(new Label() { Content = "Processor " + cpuUsage.NextValue()+ " %" });
cont.Children.Add(new Label() { Content = "memory free  " + memUsage.NextValue() +" mb"});
//добавить System.Management
string Query = "SELECT MaxCapacity FROM Win32_PhysicalMemoryArray";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(Query);
foreach (ManagementObject WniPART in searcher.Get())
{
UInt32 SizeinKB = Convert.ToUInt32(WniPART.Properties["MaxCapacity"].Value);
UInt32 SizeinMB = SizeinKB / 1024;
UInt32 SizeinGB = SizeinMB / 1024;
cont.Children.Add(new Label() { Content = "memory " + ((memUsage.NextValue() / SizeinMB)*100)+"% used" });
cont.Children.Add(new Label() { Content = "memory used " + (SizeinMB - memUsage.NextValue())});
cont.Children.Add(new Label() { Content = "page used " + pageUsage.NextValue() });
foreach (var item in netUsage)
{
cont.Children.Add(new Label() { Content = "network  " + item.NextValue() });
}
}
}));
}
private List<PerformanceCounter> GetNetCounters()
{
string filter = "MS TCP Loopback interface";
List<string> nics = new List<string>();
PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface", System.Environment.MachineName);
if (category.GetInstanceNames() != null)
{
foreach (string nic in category.GetInstanceNames())
{
if (!nic.Equals(filter, StringComparison.InvariantCultureIgnoreCase))
{ nics.Add(nic); }
}
List<PerformanceCounter> nicCounters = new List<PerformanceCounter>();
foreach (string nicInstance in nics)
{
nicCounters.Add(new PerformanceCounter("Network Interface", "Bytes Total/sec", nicInstance, System.Environment.MachineName));
}
return nicCounters;
}
else
{
return null;
}
}
}

Счетчики использую стандартные системные счетчики с которых они и берут данные.

Подробнее о счетчиках:

http://msdn.microsoft.com/en-us/library/ms998581.aspx

http://technet.microsoft.com/en-us/library/cc938593.aspx

http://blogs.msdn.com...setting-up-performance-counters-in-your-web-and-worker-roles.aspx

Увеличение размеров пакетов в WCF Service.

Иногда бывает так что ваш ответ от сервера слишком большой и клиент говорит что превышен максимальный размер сообщение в 65536.
В таком случае в app.config (или web.config) клиента нужно указать максимальный размер сообщения которое может получить клиент, например - maxReceivedMessageSize="2147483647"  - это примерно 2GB. Это максимальное значение.
 

<bindings>
<basicHttpBinding>
<binding name="userHttp" maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
<binding name="StreamedBinding" transferMode="Streamed" maxReceivedMessageSize="2147483647" />
</basicHttpBinding>
</bindings>

Так же стоит упомянть о таймаутах:

 

<binding name="BasicHttpBinding_IReportService" 
closeTimeout="00:10:00" 
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647">
</binding>

closeTimeout, openTimeout, receiveTimeout, sendTimeout – задают время за которые должна выполниться операция. Если вы получаете и отправляете большие данные то возможно вам это понадобиться. По умолчанию значение 00:01:00 – что значит одна минута.

События в C# или как сделать свой Event

Events – это события которые вызывает ваш класс, информируя тем самым своих подписчиков о том что произошло какое-то либо событие.
Если вам нужно передавать какие-либо параметры то кроме самого event’a вам нужно реализовать свой класс EventArgs через который вы и будете передавать параметры.

//создаем своей EventArgs.
public class TestEventArgs: EventArgs
{
public TestEventArgs(string s) { Text = s; }
public String Text {get; set;} 
}
public class Publisher
{
// создали делегат
public delegate void TestEventHandler(object sender, TestEventArgs e);
// объявили event
public event TestEventHandler TestEvent;
// функция вызова делегата
protected virtual void DoSomethingEvent()
{
if (TestEvent != null)
TestEvent(this, new TestEventArgs("Hi"));
}
}

 или

public class Publisher
{
	// объявили event
	public event EventHandler<TestEventArgs> TestEvent;
	// функция вызова делегата           
	protected virtual void DoSomethingEvent()
	{
		var handler = Interlocked.CompareExchange(ref this.TestEvent, null, null);

		if (handler != null)
		{
			handler(this, new TestEventArgs("Hi"));
		}
	}
}

Стоит упомянуть что  эту проверку надо делать обязательно. Она означает что у вас есть подписчики и есть кому отправлять событие.

if (TestEvent != null)
TestEvent(this, new TestEventArgs("Hi"));

А еще лучше вот так:

var handler = Interlocked.CompareExchange(ref this.TestEvent, null, null);

                if (handler != null)
                {
                    handler(this, new TestEventArgs("Hi"));
                }

Если проверки не сделать, то у вас может образоваться исключение.

Ну и в завершении, подписываться на события:

Test.TestEvent += new TestEventHandler();

Или так:

var handler = Volatile.Read(ref this.TestEvent);

                if (handler != null)
                {
                    handler(this, new TestEventArgs("Hi"));
                }

Или вот так, для C# 6:

Volatile.Read(ref this.TestEvent)?.Invoke(this, new TestEventArgs("Hi"));;

Или вот так, для C# 6:

Interlocked.CompareExchange(ref this.TestEvent, null, null)?.Invoke(this, new TestEventArgs("Hi"));

Отписывается от события:

Test.TestEvent -= new TestEventHandler();


Что почитать:
http://msdn.microsoft.com/ru-ru/library/8627sbea.aspx

https://habrahabr.ru/post/272571/

https://habrahabr.ru/post/240385/

Как создать поток C#

void RunThread()
{
System.Threading.Thread newThread;
newThread = new System.Threading.Thread(Run);
newThread.Start();
}

void Run()
{
//какая-то работа
}

WebBrowser WPF как сохранить изображение (CAPTCHA), и как изменить HTML код в странице

Столкнулся я проблемой, как сохранить динамическую картинку из браузера, например это Captcha – ведь сколько бы я не обращался по адресу картинки она каждый раз будет новая.
Для решения задачи я решил использовал WPF WebBrower, вам понадобиться подключить библиотеку Microsoft.mshtml для удобной работы с DOM.
В общем получился вот такой код, который позволяет сохранить именно ту картинку которая должна отображаться в странице, для этого: 

try
{
mshtml.HTMLDocumentClass dom = (mshtml.HTMLDocumentClass)wborwser.Document;
foreach (var item in dom.images)
{
if ((item as mshtml.HTMLImgClass).alt == "CAPTCHA")// я как-то идентифицирую нужную картинку
{
mshtml.IHTMLElement2 body2 = (mshtml.IHTMLElement2)dom.body;
mshtml.IHTMLControlRange controlRange = (mshtml.IHTMLControlRange)body2.createControlRange();
//  (item as mshtml.HTMLImgClass).
string strElName;
controlRange.add((mshtml.IHTMLControlElement)item);
controlRange.execCommand("Copy", false, System.Reflection.Missing.Value);
controlRange.remove(0);
strElName = (item as mshtml.HTMLImgClass).nameProp;
if (Clipboard.GetDataObject() != null)
{
IDataObject data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Bitmap))
{
System.Windows.Interop.InteropBitmap image = (System.Windows.Interop.InteropBitmap)data.GetData(DataFormats.Bitmap, true);
Cap_Img.Source = (ImageSource)data.GetData(DataFormats.Bitmap, true);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
string ThumbnailPath = Guid.NewGuid().ToString() + ".jpg";
FileStream stream = new FileStream(ThumbnailPath, FileMode.Create);
encoder.Save(stream);
stream.Close();
ImageSourceConverter conv = new ImageSourceConverter();
ImageSource imageSource = (ImageSource)conv.ConvertFromString(ThumbnailPath);
Cap_Img.Source = imageSource;
}
}
}
}
}
catch
{
Status.Content = "Ошибка загруки";
BusyIndicator.IsBusy = false;
}

 

В результате в папке с exe файлом появляется нужная мне картинка.

 

Дальше для заполнения полей или еще чего либо можно использовать:

dom.getElementById("TextBoxID").innerText = "какой-то текст";

 

А для имитации нажатия или клика на контрол:

 

dom.getElementById("ButtinID").click();

 

Как получить доступ из потока к элементам интерфейса в C# WPF / Silverlight

Dispatcher.BeginInvoke(new ThreadStart(delegate { 
//ваш код
}));

или

Dispatcher.BeginInvoke(new ThreadStart(()=> { 
//ваш код
}));

или

Dispatcher.BeginInvoke(()=> { 
//ваш код
});

или

Dispatcher.Invoke(new Action(() =>
{
//ваш код
}));

или

System.Windows.Application.Current.Dispatcher.Invoke(() =>
{
//ваш код
})

 

и добавить:

using System.Threading;

Кстати, никогда не используйте Dispatcher.CurrentDispatcher. 

В место него используйте Application.Current.Dispatcher.

Подробнее об этом: http://it3xl.wordpress.com

Скриншот с WPF WebBrowser

Взял отсюда http://nethelp.wikidot.com/save-as-image-using-drawingimage-in-wpf

public static string GetThumbnailImage(WebBrowser CurrentBrowser)
{
Guid guid = Guid.NewGuid();
string ThumbnailPath =  guid.ToString() + ".png";
Image imgScreen = new Image();
imgScreen.Width = 120;
imgScreen.Height = 100;
imgScreen.Source = new DrawingImage(VisualTreeHelper.GetDrawing(CurrentBrowser));
FileStream stream = new FileStream(ThumbnailPath, FileMode.Create);
DrawingVisual vis = new DrawingVisual();
DrawingContext cont = vis.RenderOpen();
cont.DrawImage(imgScreen.Source, new Rect(new Size(120d, 100d)));
cont.Close();
RenderTargetBitmap rtb = new RenderTargetBitmap((int)imgScreen.Width,
(int)imgScreen.Height, 96d, 96d, PixelFormats.Default);
rtb.Render(vis);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
encoder.Save(stream);
stream.Close();
return ThumbnailPath;
}