Для получения полного доступа
зарегистрируйтесь.

Раздел:
Подраздел:
Языки:


jestonedev
  • Репутация: 99
  • Сниппеты: 11
  • Ревизии: 1

Данный стеш не является реализацией какого-то полезного функционала, а служит лишь для ознакомления с нововведениями синтаксиса шестой версии языка C#

// ******************
// 1. Интерполяция строк
const string name = "Vasily";
var text = $"My name is {name}.";   // My name is Vasily

// ******************
// 2. Индексный инициализатор
var list = new Dictionary<string, int>
{
    ["Three"] = 3,
    ["Four"] = 4
};

// ******************
// 3. Новый способ инициализации auto-implemented свойств
public int MyProp { get; } = 3;

// ******************
// 4. Возможность объявления методов класса в стрелочной нотации лямбда
class MyClass {
	public static int Mul3(int x) => 3*x; // MyClass.Mul3(4) --> 12
}

// ******************
// 5. Оператор .? - это самое ожидаемое мной нововведение в синтаксис языка
// и я с нетерпением жду, когда другие языки (в частности JavaScript и PHP) реализуют эту идею.
// Данный оператор позволяет решить проблему проверки на null в многовложенных цепочках обращений:
var list = new List<Person>() { new Person() }; 
var chiefSurname = list[0]?.Chief?.Surname;  // Если Chief == null, в chiefSurname будет записано null
PropertyChanged?.Invoke(e)  // Вызов обработчика события при условии, что он сущестует

// ******************
// 6. nameof() - это не метод, это инструкция, аналогичная инструкции typeof(), 
// возвращает имя объекта/свойства в виде строки
var person = new Person();
Console.WriteLine(nameof(person.Surname));  // --> "Surname"

// ******************
// 7. Условные catch-блоки
try
{
    throw new ArgumentException("Blablabla","myparam");
}
// В этот catch-блок будет выполнен вход только при соответствии условия
catch (ArgumentException e) when (e.ParamName == "myparam")
{
    Console.WriteLine($"Argument {e.ParamName} is missing");
}
// Все остальные ошибки типа ArgumentException будут обработаны этим catch-блоком
catch (ArgumentException e)
{
    Console.WriteLine("Any unknown argument");
}

// ******************
// 8. Статический импорт методов. Никогда не используйте эту возможность! 
// Привожу пример лишь для полноты изложения
using static System.Console;
// теперь статические методы класса Console можно использовать без указания имени класса
ReadLine();

// ******************
// 9. Появилась возможность использовать await в блоках catch/finally
async static void Test()
{
    try
    {
        throw new Exception();
    }
    catch (Exception e)
    {
        await LogResultAsync("Site download failed", e);
    }
}

async static Task LogResultAsync(string msg, Exception e)
{
    await Task.Delay(1000).ContinueWith((r) => { Console.WriteLine(msg); });
}
jestonedev
  • Репутация: 99
  • Сниппеты: 11
  • Ревизии: 1

Использование string hello = "Hello"; int i = 42; dynamic il = new IL<int>(/аргументы метода/new object[] { hello, i }); //тело метода il.Emit(OpCodes.Ldarg_0); il.EmitCall(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), null); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ret); //выполняем и получаем результат int j = il.Exec(); Console.WriteLine(j); Console.ReadLine();

internal class IL<T>: DynamicObject 
{
	private object[] args;
	private DynamicMethod method;
	private ILGenerator generator;
	
	public IL(object[] args) 
	{
		this.args = args;
		Type[] _args = new Type[args.Length];
		for (int i = 0; i < args.Length; i++)
			_args[i] = args[i].GetType();
		this.method = new DynamicMethod("Method", typeof(T), _args, typeof(string).Module);
		this.generator = this.method.GetILGenerator(); 
	}
	
	public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
	{
		try 
		{
			return null == (result = typeof(ILGenerator).InvokeMember(binder.Name, BindingFlags.InvokeMethod, null, this.generator, args));
		} catch 
		{
			return null != (result = null); 
		}
	}
	
	public T Exec() 
	{
		return (T)this.method.Invoke(this, this.args); 
	}
}
Gravatar image
Ivan Kochurkin
  • Репутация: 14
  • Сниппеты: 1
  • Ревизии: 0

Игра "Змейка" реализованная в исходном коде (Квайн). Для каждого следующего шага необходимо компилировать код и сохранять его в файл (пока только Windows):

Продолжение »

Gravatar image
1g0r
  • Репутация: 5
  • Сниппеты: 1
  • Ревизии: 0

Если тип не известен при компиляции, а будет известен только в рантайме. Например, метод принимает object в качестве параметра (метод Foo ниже)

public static class DynamicOverride
{
	private static void Print(dynamic arg)
	{
		Console.Write("No override was found for type {0}", arg.GetType());
	}
	private static void Print(int gp)
	{
		Console.WriteLine("The type is int");
	}
	private static void Print(string gp)
	{
		Console.WriteLine("The type is string");
	}
	private static void Print(bool gp)
	{
		Console.WriteLine("The type is boolean");
	}

	static void Main(string[] args)
	{
		Foo(123);
		Foo("string");
		Foo(true);
		Foo(12.3);
		Console.ReadKey();
	}

	static void Foo(object obj)
	{
		Print((dynamic)obj);
	}
}

//Результат:
//The type is int
//The type is string
//The type is boolean
//No override was found for type System.Double
Сниппет,  C#

Reverse single linked list

Gravatar image
isxaker
  • Репутация: 8
  • Сниппеты: 4
  • Ревизии: 0

For reversing the linked list

public void Reverse()
{
	Node cur = _root;
	Node prev = null;

	while(cur != null)
	{
		Node next = cur.Next;
		cur.Next = prev;
		prev = cur;
		cur = next;
	}
	_root = prev;
}
Gravatar image
mrrl
  • Репутация: 3
  • Сниппеты: 6
  • Ревизии: 0

Рекурсивный вызов x=f(y) надо заменить на arg[0]=y; yield return f; x=arg[0];

Вызов самой функции превращается в y=RRFunc.Execute(f,x); RRFunc.Fact - преобразованная функция факториала: int fact(int k){ if(k>2) k*=fact(k-1); return k; }

public delegate IEnumerable<RFunc> RFunc(object[] argres);
class RRFunc {
    public static object Execute(RFunc func,object obj) {
        object[] arg=new object[1] { obj };
        Stack<IEnumerator<RFunc>> stack=new Stack<IEnumerator<RFunc>>();
        for(;;) {
            if(func!=null) stack.Push(func(arg).GetEnumerator()); // recursive call
            else if(stack.Count==1) return arg[0];
            else stack.Pop();
            stack.Peek().MoveNext();
            func=stack.Peek().Current;
        }
    }
    public static IEnumerable<RFunc> Fact(object[] arg) {
        int k=(int)arg[0];
        if(k>2) {
            arg[0]=k-1;
            yield return Fact;
            arg[0]=(int)arg[0]*k;
        }
        yield return null;
    }
}
Gravatar image
chandrush
  • Репутация: 2
  • Сниппеты: 1
  • Ревизии: 0

несмотря на наличие цикла, генерация случайного числа для интервалов значительно меньше диапазона [0; uint.MaxValue], скорее всего будет выполняться 1 раз.

const uint RandomStart = 1048576;
const uint RandomEnd = 33554431;
const uint RandomLength = RandomEnd - RandomStart + 1;

private static readonly ThreadLocal<Random> RandomWrapper = new ThreadLocal<Random>(() => {
	int seed = Environment.TickCount;
	return new Random(Interlocked.Increment(ref seed));
});

public static uint GetRandom()
{
	uint limit = uint.MaxValue - uint.MaxValue % RandomLength;
	uint uRandom;
	do
	{
		byte[] buf = new byte[4];
		uRandom = BitConverter.ToUInt32(RandomWrapper.Value.NextBytes(buf), 0);
	} while (uRandom > limit);
	return uRandom % RandomLength + RandomStart;
}
Gravatar image
zelyony
  • Репутация: 2
  • Сниппеты: 1
  • Ревизии: 0

Рисует в консольке с вашей "мутацией". Создайте C# Console проект. Замените Program.cs на этот код. Скомпиляйте, запускайте и медитируйте.

Или скомпиляйте из командной строки (нужен .NET Framework), предварительно сохранив код в файл Carpet.cs

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -t:exe Carpet.cs Версию \v4.0.30319\ укажите имеющуюся

P.S. оказывается пустые строки и строки со скобками не считаются. вот и поформатировал

using System;

public static class Program 
{
	//static uint Next( uint v ) { var t = (v | (v - 1)) + 1; return t | ( uint )((((t & -t) / (v & -v)) >> 1) - 1); }
	//static uint Next( uint v ) { return (v << 1) | ( uint )(( int )v < 0 ? 1 : 0); }
	static uint Next( uint v ) { return v + v % 10 + v / 10; }
	
	static char[] Reverse( char[] ar ) { Array.Reverse( ar ); return ar; }
	
	static string Bin( uint v ) 
	{
		var r = Convert.ToString( v, 2 ).Replace( '0', ' ' ).Replace( '1', '*' ).PadLeft( 32, ' ' );
		return r + new string( Reverse( r.ToCharArray() ) );
	}
	
	static void Main() 
	{
		Console.BufferWidth = Console.WindowWidth = 64; Console.BufferHeight = Console.WindowHeight = 32;
		for (uint K = 0x10001, k = K; true; k = Next( k ) == 0 || Next( k ) == ~0U ? K : Next( k )) 
		{
			Console.MoveBufferArea( 0, 1, 64, 15, 0, 0 ); 
			Console.MoveBufferArea( 0, 16, 64, 15, 0, 17 );
			Console.ForegroundColor = ( ConsoleColor )((k & 0x7) + 8);
			Console.SetCursorPosition( 0, 15 ); Console.Write( Bin( k ) );
			Console.SetCursorPosition( 0, 16 ); Console.Write( Bin( k ) );
			System.Threading.Thread.Sleep( 40 );
		} 
	} 
}
// Create C# Console project. Change Program.cs to this code. Compile and run it.
// U can change Next() mutation
Gravatar image
wetlook
  • Репутация: 1
  • Сниппеты: 3
  • Ревизии: 0

Usage:

var _tableRows = movedRow.Table.WhereTableRowStateIsNotDeleted().ToArray();

var _childs = Tool.GetChildrensFrom(movedRow,

                                           r =>
                                           _tableRows.Where(c => c[FMTP.ParentId].GetInt32() == r[FC.Id].GetInt32()));
        /// <summary> Generic method to get all childrens from current element</summary>
		/// <param name="element">element</param>
		/// <param name="getChilds"> func to get childrens </param>
		/// <returns></returns>
		public static List<T> GetChildrensFrom<T>([NotNull] T element, [NotNull] Func<T, IEnumerable<T>> getChilds) where T : class
		{	
			var _allChilds = new List<T>();	var _proceded = new List<T>();	var _queue = new Queue<T>();
			_queue.Enqueue(element);

			while (_queue.Any())
			{
				var _currentElement = _queue.Dequeue();

				if (_proceded.Contains(_currentElement))
					continue;

				var _childs = getChilds(_currentElement).ToList();

				if (_childs.Any())
				{
					_allChilds.AddRange(_childs);
					_queue.EnqueueRange(_childs);
					_childs.Clear();
				}
				_proceded.Add(_currentElement);
			}
			
			_proceded.Clear();
			_queue.Clear();

			return _allChilds;
		}
Gravatar image
Борис Вандышев
  • Репутация: 3
  • Сниппеты: 2
  • Ревизии: 0
  public class PropertyStore
  {
      private readonly ConcurrentDictionary<string, object> _dictionary = new ConcurrentDictionary<string, object>();
      public T Get<T>(Func<T> instanceCreator, [CallerMemberName] string propertyName = "")
      {
          _dictionary.GetOrAdd(propertyName, key => instanceCreator());
          return (T)_dictionary[propertyName];
      }

      public void Set<T>(T value, [CallerMemberName] string propertyName = "")
      {
          _dictionary.AddOrUpdate(propertyName, value, (key, oldValue) => value);
      }
  }

Использование:

  public class MyClass
  {
      private readonly PropertyStore _store = new PropertyStore();

      public string MyString
      {
          get => _store.Get(() => "It's my default string");
          set => _store.Set(value);
      }

      public int MyInt
      {
          get => _store.Get(() => 5);
          set => _store.Set(value);
      }

      public SecondClass MySecondClass
      {
          get => _store.Get(() => new SecondClass());
          set => _store.Set(value);
      }
  }

Проверка:

  class Program
  {
      static void Main(string[] args)
      {
          var myClass = new MyClass();

          Console.WriteLine(myClass.MyString); //"It's my default string"
          myClass.MyString = "Custom string";
          Console.WriteLine(myClass.MyString); //Custom string

          Console.WriteLine(myClass.MyInt); //5
          myClass.MyInt = 10;
          Console.WriteLine(myClass.MyInt); //10

          Console.WriteLine(myClass.MySecondClass); //SecondClass Initialized
                                                    //SecondClass

          Console.WriteLine(myClass.MySecondClass); //SecondClass
      }
  }

  public class SecondClass
  {
      public SecondClass()
      {
          Console.WriteLine($"{nameof(SecondClass)} Initialized");
      }

      public override string ToString()
      {
          return nameof(SecondClass);
      }
  }