Хочу я получит последний элемент массива
int lastItem = array[array.Count - 1];
Но так мне не нравится, хочется
int lastItem = array.LastItem();
Но я никак не могу в extension methods, покажите, пожалуйста, как это сделать.
Еще, хочу сделать класс Stack, который будет реализовать функции стека и будет иметь методы push() и pop(), но стек может хранить разные данные (но все одного типа), для этого, как я понял, нужны Generics, которые опять же я не могу осилить, как реализовать что-то типа
class Stack
{
private List <вот тут как-то указывать тип> stack;
Stack()
{
this.stack = new Stack <тип>();
}
public void push(<тут тип, который был указан при создании экземпляра класса> item)
{
this.stack.Add(item);
}
public void pop()
{
this.stack.RemoveAt(stack.Count-1);
}
}
Как это сделать? Чтобы использовать
var stack = new Stack <float>();
stack.push(3.14);
stack.push(5.63);
stack.pop();
stack.pop();
Прошу подсказать, чтобы было от чего оттолкнутся, а то во всех доках из гугла все запутанно и нихера не понятно, заранее спасибо.
Редактировался Babusha (30-09-11 01:34:40)
Неактивен
MOP3E,
https://msdn.microsoft.com/ru-ru/library/bb383977.aspx
А вот в доке от майкрасофта есть пример
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
using ExtensionMethods;
string s = "Hello Extension Methods";
int i = s.WordCount();
Только я не могу понять, как такое сделать для List, так же List использует Generics, которые же я не могу осилить.
Редактировался Babusha (30-09-11 01:39:56)
Неактивен
Ну, тогда можно забабахать какой-нибудь класс с массивом внутри и индексаторами снаружи...
Ну блин, а зачем тогда были придуманы extension methods? По идее с ключевым словом "this" у меня все должно элементарно получится, как в примере майкрасофта с методом для String WordCount(), только не имею представления как это реализовать.
Редактировался Babusha (30-09-11 01:44:13)
Неактивен
Дай ссылку на статью, завтра попробую реализовать, если время свободное на работе будет.
https://msdn.microsoft.com/ru-ru/library/bb383977.aspx , вот, пожалуйста, а вот на английском https://msdn.microsoft.com/en-us/library/bb383977.aspx.
А будут идеи насчет класса Stack и как впихнуть туда генериксы?
Добавлено спустя 11 мин 34 с:
Ура! Покопался в ЛС, когда-то давно у Тифона спрашивал про generics, нашел ссылку https://msdn.microsoft.com/en-us/library … s.80).aspx , русский гугл, гад, на английские доки от майкрасофта редко выводит, там полное описание использования generics, плюс, какое офигенное совпадение, там как пример, используется стек , все спасибо большое! Неясно только самое первое.
Неактивен
MOP3E, если честно, меня интересовало List, который вроде-бы с обычными массивами не одно и тоже, List позволяет сделать динамический массив, плюс, в перечни https://msdn.microsoft.com/en-us/library/6sh2ey19.aspx нету методов таких (LastItem и LastItemIndex).
Добавлено спустя 33 мин 47 с:
Вот, если кому интересно, вот как я реализовал Stack
class Stack <Type>
{
public int Size;
private List <Type> stack;
public Stack()
{
this.stack = new List<Type>();
}
public void Push(Type item)
{
this.stack.Add(item);
this.Size = this.stack.Count;
}
public void Pop()
{
this.stack.RemoveAt(this.stack.Count-1);
this.Size = this.stack.Count;
}
public Type FirstItem()
{
return this.stack[0];
}
public Type LastItem()
{
return this.stack[this.stack.Count-1];
}
}
Добавлено спустя 1 ч 35 мин 56 с:
У кого-то будут мысли что делать с List?
Редактировался Babusha (30-09-11 02:07:28)
Неактивен
Babusha, наконец-то ты заговорил на читабельном и многим понятном языке хД Молодец, мозги развивает. Что пишешь в целом то?
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
С листом не пробовал. Одномерный массив можно ресайзить без потери содержимого при помощи функции Array.Resize(), что в сочетании с расширенными методами позволит сделать его ну почти как лист.
https://www.dotnetperls.com/array-resize
Тут написано, что имеет проблемы с производительностью.
Babusha, наконец-то ты заговорил на читабельном и многим понятном языке хД Молодец, мозги развивает. Что пишешь в целом то?
Решил сделать няшный язык программирования на основе бреинфака, только с блекджеком и шлюхами, сейчас пишу интерпретатор байткода (виртуальную машину), чуть позже - компилятор.
MOP3E, вот попробовал сделать с листом
using System;
using System.Collections.Generic;
using ExtensionMethods;
namespace ExtensionMethods
{
public static class MyExtensions
{
public static string LastItem(this List <string> array)
{
return array[array.Count-1];
}
}
}
namespace extensionmethods
{
class MainClass
{
public static void Main (string[] args)
{
var array = new List <string> ();
array.Add("олололо");
array.Add("я послений элемент этого массива");
Console.WriteLine(array.LastItem());
}
}
}
Но черт, а генериксы впихнуть не получается, (вот моя попытка)
using System;
using System.Collections.Generic;
using ExtensionMethods;
namespace ExtensionMethods
{
public static class MyExtensions <Type>
{
public static Type LastItem (this List <Type> array)
{
return array[array.Count-1];
}
}
}
namespace extensionmethods
{
class MainClass
{
public static void Main (string[] args)
{
var array = new List <string> ();
array.Add("олололо");
array.Add("я послений элемент этого массива");
Console.WriteLine(array.LastItem());
}
}
}
Но мне пишет, что метода расширения должны определятся в небазовом статическом классе в строке
public static class MyExtensions <Type>
Добавлено спустя 41 мин 41 с:
Секундочку, стоп, а везде this указывать, когда хочу обратится к полю класса или методу обязательно?
Добавлено спустя 1 ч 05 мин 09 с:
А вот в руби можно делать необязательные аргументы, как бы такое сделать в шарпе?
def method(arg = 10)
puts arg
end
method 100500 # => 100500
method() # => 10
Добавлено спустя 1 ч 13 мин 23 с:
Опа, вот так работает -
using System;
namespace Test
{
class Ololo
{
public static int test(int arg = 10)
{
return arg;
}
public static void Main(String[] args)
{
Console.WriteLine(test(50));
Console.WriteLine(test());
}
}
}
Неактивен
Babusha, я что-то упустил в своей жизни.. Бабуша пишет компилятор.. ебануцца. Ростут же дети :-D Тебе компанию составить? У меня опыт в шарпах уже имеется не большой + опыт глобальный. Завтра буду выходной, можем вместе поковырять это дело.
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
Babusha, я что-то упустил в своей жизни.. Бабуша пишет компилятор.. ебануцца. Ростут же дети :-D Тебе компанию составить? У меня опыт в шарпах уже имеется не большой + опыт глобальный. Завтра буду выходной, можем вместе поковырять это дело.
Вот черт, я сегодня уезжаю и буду только в вечер воскресенья , есть только пару чЯсиков сейчас.
Кстати, а дайте кто-то совет, это хорошо или плохо делать очень длинные имена переменным и методам? А то получается типа JumpToByteCodeIndexWithOffsetAdress() или BrainfuckByteCodeCommand["+"], с одной стороны, полностью очевидно и ясно для чего эта переменная или метод и что она хранит или что метод делает, но с другой стороны, получается очень длиино, как поступать? Просто в руби не принято делать длинные имена переменным, и все закончилось бы просто jump_to() bf_cmd(), но мне так не нравится.
Редактировался Babusha (30-09-11 15:27:19)
Неактивен
Babusha, я ща похапе ипу. Лука обещал ящик пива :-D Ну давай в воскр. Правда я буду опять на работе.. нетбук с маленьким экраном, засраная хрюша, С# Девелоп/Моно.. бррр Дома серверная семерка(со включенным Аэро), полноценная Визуал Студия..ммм.. с лицензией Ну ниче, покодим:-)
Добавлено спустя 02 мин 22 с:
Babusha, имена лучше давать чуть короче, но так, чтоб их можно было легко узнать и отличить друг от друга. А там, где ты их определяешь, просто оставляй комментарий, что и к чему. Опыт 'брейнфака' на перле приучил к комментариям
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
MOP3E, с этого места подробнее. Что за комментарии такие?
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
Lord_Evil, https://club.shelek.ru/viewart.php?id=164
Неактивен
Дестер, спасибо) Буду юзать.
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
Ребята? Вы че?!
Просто добавьте Linq в using и используйте уже готовый
array.Last();
array.First();
Полный пример:
https://msdn.microsoft.com/en-us/library/bb358775.aspx
Вот список всех экстеншенов из Linq
https://msdn.microsoft.com/en-us/library … rable.aspx
P.S. Скажу свое "НЕТ" изобретателям велосипедов...
Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.
Неактивен
MOP3E, отлично, для больших проектов, особенно коммандных волбще класс.
Tiphon, готовся - в воскресенья я и Бабуша бедем иметь секас с твоим мозгом хД хД хД Есть шанс, что это станет перманентным событием.. подумываю начать серьезную деятельность на С#
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
Tiphon, ну блииин, это же был почти учебный пример, вот скажи, как скрестить List extension methods и Generics?
Неактивен