Самый классный С# LINQ/Lambdas трюк, который вы когда-либо вытаскивали?
Пила сообщение о скрытых функциях в С#, но не многие люди написали пример linq/lambdas, так что... Интересно...
Какое самое крутое (как в самом элегантном) использование С# LINQ и/или Lambdas/анонимных делегатов, которые вы когда-либо видели/писали?
Бонус, если он тоже вступил в производство!
Ответы
Ответ 1
LINQ Raytracer, безусловно, возглавляет мой список =)
Я не совсем уверен, если он квалифицируется как элегантный, но это, безусловно, самое крутое выражение linq, которое я когда-либо видел!
О, и просто быть предельно ясным; Я не писал (Люк Хобан)
Ответ 2
Некоторые основные функционалы:
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);
}
}
Не делайте много пользы, если вы не знаете, как их использовать. Чтобы знать это, вам нужно знать, для чего они предназначены:
Ответ 3
На сегодняшний день самая впечатляющая реализация Linq, с которой я когда-либо сталкивалась, - это структура Брахмы.
Он может использоваться для разгрузки параллельных вычислений на графический процессор с использованием "Linq to GPU". Вы пишете "запрос" в linq, а затем Brahma переводит его в HLSL (High Shader Language), поэтому DirectX может обрабатывать его на графическом процессоре.
Этот сайт позволит мне вставить только одну ссылку, поэтому попробуйте эту трансляцию из dotnetrocks:
http://www.dotnetrocks.com/default.aspx?showNum=466
Else google для проекта Брахмы, вы получите правильные страницы.
Чрезвычайно классный материал.
ГДж
Ответ 4
Отчет о проделанной работе для длинных запросов LINQ. В сообщении в блоге вы можете найти метод расширения WithProgressReporting(), который позволяет вам обнаруживать и сообщать о ходе выполнения запроса linq по мере его выполнения.
Ответ 5
http://igoro.com/archive/extended-linq-additional-operators-for-linq-to-objects/
http://igoro.com/archive/7-tricks-to-simplify-your-programs-with-linq/
Ответ 6
Для меня двойственность между делегатами (Func<T,R>
, Action<T>
) и выражениями (Expression<Func<T,R>>
Expression<Action<T>>
) - это то, что приводит к наиболее умному использованию лямбда.
Например:
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 );
Примечание. Я видел это в Интернете сначала несколько недель назад, а затем потерял ссылку, и с тех пор меня размножало множество вариаций, поэтому я боюсь, что не могу дать надлежащую атрибуцию.
Ответ 7
Не мой дизайн, но я использовал его несколько раз, оператор с типизированным переключением: http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx
Сохранял меня так много, если... else if... else if... else IF! заявления
Ответ 8
Собственно, я очень горжусь этим, создавая документы Excel: http://www.aaron-powell.com/linq-to-xml-to-excel
Ответ 9
Я сделал одну (немного сумасшедшую, но интересную) вещь вроде этого совсем недавно:
Ответ 10
Я пытался придумать классный способ создания навигационного элемента управления для сайта, который я строил. Я хотел использовать регулярные неупорядоченные элементы списка HTML (используя стандартный CSS "Sucker Fish" look) с эффектом перетаскивания с верхней навигацией, который показывает раскрывающиеся предметы. У меня был 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 - это что-то в этом случае.
Ответ 11
Я думаю, что LINQ - это серьезное изменение в .NET, и это очень мощный инструмент.
Я использую LINQ to XML в процессе производства для анализа и фильтрации записей из XML файла 6 МБ (с уровнями 20+ node) в набор данных в двух строках кода.
Перед LINQ для отладки потребовалось бы сотни строк кода и дней.
Это то, что я называю элегантным!
Ответ 12
Возможно, это не самый классный, но в последнее время я использую их в любое время, когда у меня есть блок кода, который снова и снова запускает 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 пятнадцать миллионов раз для каждой команды, объекта и т.д.
Ответ 13
Работа с атрибутами:
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
в этом примере.
Ответ 14
OLINQ реактивные запросы LINQ по сравнению с INotifyingCollection - это позволяет вам (помимо всего прочего) выполнять агрегацию в реальном времени против больших наборов данных.
https://github.com/wasabii/OLinq