Интересно, а можно ли в C# сделать что-то вроде

kruzer25

int[] {a, b} = (int[]"123 456".Split

?
В пхп это бы выглядело так:
list($a, $b) = explode(" ", "123 456");

А сейчас приходится писать как-то так:
string[] tmp = "123 456".Split;
int a = int.Parse(tmp[0]);
int b = int.Parse(tmp[1]);

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

klyv

так, чтобы переменные были во внешней зоне видимости, нельзя.

6yrop

Можно вот так
 

int a = 0;
int b = 0;
"123 456".Split.Select(x => int.Parse(x.ForEach(x => a = x, x => b = x);

 

public static void ForEach<T>(
this IEnumerable<T> enumerable,
params Action<T>[] actions)
{
IEnumerator<T> enumerator = enumerable.GetEnumerator;
foreach (var action in actions)
{
if (!enumerator.MoveNext
{
throw new ArgumentOutOfRangeException;
}
action(enumerator.Current);
}
}

Но я бы остановился вот на таком
 

var ints = "123 456".Split.Select(x => int.Parse(x.ToArray;
var a = ints[0];
var b = ints[1];

Dasar

int[] {a, b} = (int[]"123 456".Split
можно так написать:

int[] numbers = "123 456".Split(' ').Select(s => Convert.ToInt(s.ToArray;

6yrop

тк ему надо присвоить это в две локальные переменные a и b

Dasar

тк ему надо присвоить это в две локальные переменные a и b
тогда так

"130 176".Split
.Select(s => int.Parse(s
.AssignTo(Addr => a Addr => b;

6yrop

=> b
это експрешены чтол ли?
все равно плохо то, что переменные надо инициализировать

Dasar

да

class Assign
{
public static void Main2(string[] args)
{
int a = 0;
int b = 0;
"130 176".Split
.Select(s => int.Parse(s
.AssignTo(Addr => a Addr => b;
Console.WriteLine(a);
Console.WriteLine(b);
}
static Action<int> Addr(Expression<Func<int>> e)
{
var member = e.Body as MemberExpression;
var constant = member.Expression as ConstantExpression;
var item = constant.Value;
return v => FieldInfo)member.Member).SetValue(item, v);
}
}
static class Q2
{
public static void AssignTo<TValue>(this IEnumerable<TValue> vals, params Action<TValue>[] links)
{
AssignTo(vals, (IEnumerable <Action< TValue> >) links);
}
public static void AssignTo<TValue>(this IEnumerable<TValue> vals, IEnumerable<Action<TValue>> links)
{
foreach (var pair in vals.JoinByPosition(links
{
pair.Value(pair.Key);
}
}
public static IEnumerable<KeyValuePair<TKey, TValue>> JoinByPosition<TKey, TValue>(this IEnumerable<TKey> keys,
IEnumerable<TValue> vals)
{
var k = keys.GetEnumerator;
var v = vals.GetEnumerator;
for (; ; )
{
if (!k.MoveNext
break;
if (!v.MoveNext
break;
yield return new KeyValuePair<TKey, TValue>(k.Current, v.Current);
}
}
}

6yrop

тогда уж можно перегруженную функцию под это дело, сделать, чтобы совсем кратко было
 
 
"130 176".Split
.Select(s => int.Parse(s
.AssignTo => a, => b);

Dasar

тогда уж можно перегруженную функцию под это дело сделать, чтобы совсем кратко было
согласен, так еще короче будет.

6yrop

правда тут немного рефлекшена :smirk: , но в большинстве случаев, наверное, это не сильные потери в производительности

Dasar

правда тут немного рефлекшена , но в большинстве случаев, наверное, это не сильные потери в производительности
я могу туда еще emit засунуть. :D

6yrop

я могу туда еще emit засунуть.
было бы интересно посмотреть и сравнить производительность

hwh2010

сей тред очень напоминает http://www.gnu.org/fun/jokes/helloworld.html

sergeikozyr

Ещё про хацкель есть похожая поеботина. Недавно здесь в разделе проскакивала.

bleyman

А чо с точечками, а не на чистом LINQ?
(from s in "130 176".Split select int.Parse(s.AssignTo(...)
Если кто не знал, LINQ-овыский синтаксис правильно называется monad comprehension и является более мощной версией питоновского list comprehension. И именно так его следует воспринимать, и записывать в одну строчку, и использовать везде, где только можно!

sergeikozyr

синтаксис перегруженный. Из-за этого выглядит дерьмово.

bleyman

синтаксис перегруженный.
По сравнению с чем перегруженный? По сравнению с питоновским, если ты не заметил, добавилось ровно одно лишнее слово, "select". Я имею в виду, что любому питоновскому generator expression из n слов соответствует линк экспрешшен из n+1 слова, в котором йелдящееся экспрешшен перенесли в конец и отделили от предыдущего словом select (что в общем-то правильно и более по-программистски — переменные принято использовать после объявления) и текстуально заменили for на from и if на where.

sergeikozyr

в общем перегруженный. Математическая нотация а-ля haskell или python читается лучше ебанутых sql queries.

klyv

это не SQL ;)

bleyman

Чем перегруженный-то? У тебя галлюцинации какие-то по ходу.

sergeikozyr

это не SQL ;)
пример:
 
var Found = from o in Orders
where o.CustomerID == 84
select new { OrderID = o.OrderID, Cost = o.Cost };

это смертельно и тоскливо похоже на sql
 
found=[(i.OrderId, i.Cost) for i in Orders if i.CustomerId==84] 

 
found=[(orderId i, cost i) | i <- orders, customerId i == 84]  

bleyman

Блджад, так убери два лайнбрейка и получишь то же самое!
var found = from o in orders where o.CustomerID == 84 select new { o.OrderID, o.Cost };
Пиздец какой-то. Оказывается, замена for на from и if на where превращает элегантный компрехенжен в нечто "смертельно и тоскливо похожее на sql". Чувак, если у тебя такая чувственная и тонкая натура, может тебе в стилисты или визажисты лучше пойти, а? (тут было бы неплохо поставить ссылку на аналогичную по смыслу фразу Pianist'а, но я её не могу найти поиском в архиве!)

sergeikozyr

ugly by design, qed
беда в том, что кодеры всегда будут писать в несколько строчек

sergeikozyr

элегантный компрехенжен
прозреваю фаната пёрла. У них альтернативный взгляд на эти вещи.

bleyman

Я не понимаю.
Кто-нибудь понимает, что говорит этот поц? Объясните, если не сложно. У меня полное ощущение, что я общаюсь с персонажем Кафки пополам с Оруэллом — питоновский компрехенжен типа красивый, а шарповый, который точно такой же, уродлив. Что он какбэ пытается этим сказать?
Может это reenactment of the Mojave experiment? Не знаю.

sergeikozyr

 
var found = from o in orders where o.CustomerID == 84 select new { o.OrderID, o.Cost };
found=[(i.OrderId, i.Cost) for i in Orders if i.CustomerId==84]
found=[(orderId i, cost i) | i <- orders, customerId i == 84]

ну не нравится мне sql-подобный синтаксис.

bleyman

Кто иль что есть sql-подобный синтаксис, ты можешь уже прямо сказать, а? Запись yielded expression в конце, а не вначале? В sql оно вначале, вообще-то.
Или тебя только и исключительно визуальное сходство напрягает, типа есть какая-то детская травма, связанная с императивным проприетарным языком SQL, и вот именно "from" вместо "for" вызывает у тебя негативные эмоции и тремор конечностей? Зачем ты тогда считаешь необходимым поделиться со всеми нами своей бедой?

sergeikozyr

Неправильная претензия. Правильная претензия была бы по отношению к разработчикам цешарпа: какого %уя делать не так, как это было сделано уже много раз до вас?
Только не надо про monad comprehensions - вряд ли кто-нибудь будет использовать их в роли отличной от list comprehensions. Вообще, не понимаю: нахуя они нужны в цешарпе, понятное дело хацкель, там императивщины нет, приходится костыли делать. А здесь для чего?

bleyman

Кто иль что есть sql-подобный синтаксис, ты можешь уже прямо сказать, а? Запись yielded expression в конце, а не вначале? В sql оно вначале, вообще-то.

sergeikozyr

если бы было вначале, типа select ..., то и читалось бы лучше. А сейчас непрятно смотрится.

6yrop

если бы было вначале, типа select ..., то и читалось бы лучше.
слышал, что select сделали в конце, чтобы инлесенс работал

6yrop

по мне так селект в конце логичнее, у тебя есть коллекция, ты с нее стартуешь, объявляешь по ней переменную, а потом уже работаешь с текущем элементом коллекции. А то как-то странно сначала встречается переменная, а что собственно это за переменная ты узнаешь позже (читают то слева на право :) ). Да тут уже вроде писали об этом. Я даже сиквел запросы часто начинаю писать с FROM.

klyv

select сделали в начале, чтобы инлесенс работал
как-то из-за того, что список столбцов вначале, когда его вводишь, intellisense как раз бессилен в SQL, т.к. ещё не написан from.

6yrop

да конечно в конце :)
Оставить комментарий
Имя или ник:
Комментарий: