Надеемся на эту помощь
set a=%username%
echo %a%
set a="hello"
echo %a%
Трассировщик лучей LINQ , конечно, превышает мой список =)
, я не совсем уверен, квалифицирует ли как изящный, но это - несомненно самое прохладное linq-выражение, которое я когда-либо видел!
, О, и только быть чрезвычайно ясным; я сделал не запись это (, Luke Hoban сделал)
Работа с атрибутами:
private void WriteMemberDescriptions(Type type)
{
var descriptions =
from member in type.GetMembers()
let attributes = member.GetAttributes<DescriptionAttribute>(true)
let attribute = attributes.FirstOrDefault()
where attribute != null
select new
{
Member = member.Name,
Text = attribute.Description
};
foreach(var description in descriptions)
{
Console.WriteLine("{0}: {1}", description.Member, description.Text);
}
}
GetAttributes
дополнительный метод:
public static class AttributeSelection
{
public static IEnumerable<T> GetAttributes<T>(this ICustomAttributeProvider provider, bool inherit) where T : Attribute
{
if(provider == null)
{
throw new ArgumentNullException("provider");
}
return provider.GetCustomAttributes(typeof(T), inherit).Cast<T>();
}
}
AttributeSelection
производственный код и также определяет GetAttribute
и HasAttribute
. Я принял решение использовать let
и where
пункты в этом примере.
Я думаю, что LINQ является существенным изменением к.NET, и это - очень мощный инструмент.
я использую LINQ для XML в производстве, чтобы проанализировать и отфильтровать записи от XML-файла 6 МБ (с 20 + уровни узла) в набор данных в двух строках кода.
Перед LINQ это проводило бы сотни строк кода и дни для отладки.
Это - то, что я называю изящными!
Я пытался придумать прохладный способ создать управление навигацией для веб-сайта, который я создавал. Я хотел использовать регулярный HTML, незаказанный элементы списка (использующий стандарт CSS, "Рыбы Сосунка" смотрят ) с эффектом наведения мыши главной навигации, который показывает выпадающие объекты. У меня был sql зависимый, кэшируемый DataSet с двумя таблицами (NavigationTopLevels & NavigationBottomLevels). Тогда все, к чему я имел, было, создают два объекта класса (TopNav & SubNav) с несколькими необходимыми свойствами (класс TopNav должен был иметь универсальный список bottomnav объектов-> List< SubNav> SubItems).
var TopNavs = from n in ds.NavigationTopLevels select new TopNav { NavigateUrl = String.Format("{0}/{1}", tmpURL, n.id), Text = n.Text, id = n.id, SubItems = new List<SubNav>( from si in ds.NavigationBottomLevels where si.parentID == n.id select new SubNav { id = si.id, level = si.NavLevel, NavigateUrl = String.Format("{0}/{1}/{2}", tmpURL, n.id, si.id), parentID = si.parentID, Text = si.Text } ) }; List<TopNav> TopNavigation = TopNavs.ToList();
Это не могло бы быть "самым прохладным", но для большого количества людей, которые хотят иметь динамическую навигацию, ее конфета для не запутывания вокруг в обычной логике цикличного выполнения, которая идет с этим. LINQ, если что-либо средство экономии времени в этом случае.
На самом деле я довольно горжусь этим для генерации Excel docments: http://www.aaron-powell.com/linq-to-xml-to-excel
Я сделал один (немного сумасшедший, но интересный) подобная вещь просто недавно:
http://igoro.com/archive/extended-linq-additional-operators-for-linq-to-objects/
http://igoro.com/archive/7-tricks-to-simplify-your-programs-with-linq/
Прогресс, Сообщая для длительных запросов LINQ. В сообщении в блоге можно найти дополнительный метод WithProgressReporting (), который позволяет Вам обнаружить и сообщить о прогрессе запроса linq, как это выполняется.
Некоторый основной functionals:
public static class Functionals
{
// One-argument Y-Combinator.
public static Func<T, TResult> Y<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> F)
{
return t => F(Y(F))(t);
}
// Two-argument Y-Combinator.
public static Func<T1, T2, TResult> Y<T1, T2, TResult>(Func<Func<T1, T2, TResult>, Func<T1, T2, TResult>> F)
{
return (t1, t2) => F(Y(F))(t1, t2);
}
// Three-arugument Y-Combinator.
public static Func<T1, T2, T3, TResult> Y<T1, T2, T3, TResult>(Func<Func<T1, T2, T3, TResult>, Func<T1, T2, T3, TResult>> F)
{
return (t1, t2, t3) => F(Y(F))(t1, t2, t3);
}
// Four-arugument Y-Combinator.
public static Func<T1, T2, T3, T4, TResult> Y<T1, T2, T3, T4, TResult>(Func<Func<T1, T2, T3, T4, TResult>, Func<T1, T2, T3, T4, TResult>> F)
{
return (t1, t2, t3, t4) => F(Y(F))(t1, t2, t3, t4);
}
// Curry first argument
public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(Func<T1, T2, TResult> F)
{
return t1 => t2 => F(t1, t2);
}
// Curry second argument.
public static Func<T2, Func<T1, TResult>> Curry2nd<T1, T2, TResult>(Func<T1, T2, TResult> F)
{
return t2 => t1 => F(t1, t2);
}
// Uncurry first argument.
public static Func<T1, T2, TResult> Uncurry<T1, T2, TResult>(Func<T1, Func<T2, TResult>> F)
{
return (t1, t2) => F(t1)(t2);
}
// Uncurry second argument.
public static Func<T1, T2, TResult> Uncurry2nd<T1, T2, TResult>(Func<T2, Func<T1, TResult>> F)
{
return (t1, t2) => F(t2)(t1);
}
}
не делают много хорошего, если Вы не знаете, как использовать их. Чтобы знать, что, необходимо знать то, для чего они:
Не мой дизайн, но я использовал его несколько раз, введенный оператор переключения: http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx
Сохраненный меня так многие, если... еще, если... еще, если... еще, ЕСЛИ! операторы
Для меня двойственность между делегатами ( Func
, Action
) и выражениями ( Expression < Func
Expression
) - это то, что дает начало наиболее умному использованию лямбда-выражений.
Например:
public static class PropertyChangedExtensions
{
public static void Raise(this PropertyChangedEventHandler handler, Expression<Func<object>> propertyExpression)
{
if (handler != null)
{
// Retrieve lambda body
var body = propertyExpression.Body as MemberExpression;
if (body == null)
throw new ArgumentException("'propertyExpression' should be a member expression");
// Extract the right part (after "=>")
var vmExpression = body.Expression as ConstantExpression;
if (vmExpression == null)
throw new ArgumentException("'propertyExpression' body should be a constant expression");
// Create a reference to the calling object to pass it as the sender
LambdaExpression vmlambda = Expression.Lambda(vmExpression);
Delegate vmFunc = vmlambda.Compile();
object vm = vmFunc.DynamicInvoke();
// Extract the name of the property to raise a change on
string propertyName = body.Member.Name;
var e = new PropertyChangedEventArgs(propertyName);
handler(vm, e);
}
}
}
Тогда вы можете «безопасно» реализовать INotifyPropertyChanged
, позвонив по номеру
if (PropertyChanged != null)
PropertyChanged.Raise( () => MyProperty );
. Примечание. Сначала я увидел это в Интернете несколько недель назад, затем потерял ссылку, и с тех пор тут и там появилось множество вариантов, поэтому, боюсь, я не могу дать правильную атрибуцию.
Самая впечатляющая реализация Linq, с которой я когда-либо сталкивался, - это инфраструктура Brahma.
Ее можно использовать для выгрузки параллельных вычислений на графический процессор с помощью Linq to GPU. Вы пишете «запрос» в linq, а затем Брахма переводит его в HLSL (язык шейдеров высокого уровня), чтобы DirectX мог обработать его на графическом процессоре.
Этот сайт позволит мне вставить только одну ссылку, поэтому попробуйте эту веб-трансляцию с dotnetrocks:
http://www.dotnetrocks.com/default.aspx?showNum=466
Если вы хотите использовать Google для проекта Brahma Project, вы получите нужные страницы.
Чрезвычайно классный материал.
GJ
Возможно, не самый крутой, но в последнее время я использую их в любое время, когда у меня есть блок кода, который снова и снова проходит C+Pd только для того, чтобы изменить несколько строк. Например, выполнение простых SQL-команд для получения данных можно сделать так:
SqlDevice device = GetDevice();
return device.GetMultiple<Post>(
"GetPosts",
(s) => {
s.Parameters.AddWithValue("@CreatedOn", DateTime.Today);
return true;
},
(r, p) => {
p.Title = r.Get<string>("Title");
// Fill out post object
return true;
}
);
Что может вернуть список сообщений, которые были созданы сегодня. Таким образом, мне не придется копировать и вставлять блок try-catch-finally пятнадцать миллионов раз для каждой команды, объекта и так далее.