Форум   Статьи   Новости   Файлы   Bugtraq   Сниффер   Друзья   О Клубе
  , 14:32   #1
Модератор
 
Локация: Cyberspace
Регистрация: 01.07.2008
Сообщений: 122

Репутация: 75 / 1
Exclamation Кортежи

Бывало ли у вас такое, что надо вернуть из функции несколько разнотиповых значений? Я думаю, бывало. И что, по-хорошему, надо делать в этом случае? Правильно, делать структуру под этот результат. Но ведь лень, не правда ли? Придумал: сделаю я ее как out переменную и так получу - это намного быстрее. А что, все нормально работает! А потом таким же образом добавляется третья, четвертая и т.д. В итоге получается полная несуразица. Что-то вроде этого:

C# highlight
int Corteg(out float sqrt, out string someString, out char someChar, int a, int name)
{
      ...
}
Мы производим некие расчеты с числом и строкой: например обработать строку, и произвести простейшие вычисления с числом . По-моему, не очень красиво - половина там, половина там. Так вот, в .Net 4.0 появился набор классов Tuple <T1, T2...> - до 7 параметров, можно больше, но сложно и, я думаю, не сильно нужно. Если модифицировать код выше на использование кортежей:

C# highlight
Tuple<decimal,decimal,string> HowMuch(Goods wantToBuy)
{
    ...
}
для полной наглядности приведу пример программы полностью:

C# highlight
using System;

namespace TouplesTest
{
    class Program
    {
        static Tuple<int, float, string, char> Corteg(int a, string name)
        {
            int sqr = a * a;
            float sqrt = (float)(Math.Sqrt(a));
            string s = "Привет HPC от " + name + "!";
            char ch = (char)(name[0]);

            return Tuple.Create<int, float, string, char>(sqr, sqrt, s, ch);
        }
        static void Main(string[] args)
        {
            var myTuple = Corteg(25, "Fangarh");
            Console.WriteLine("{0}\n25 в квадрате: {1}\nКвадратный корень из 25: "
                + "{2}\nПервый символ в имени: {3}\n", myTuple.Item3, myTuple.Item1, 
                myTuple.Item2, myTuple.Item4);
            Console.ReadLine();
        }
    }
}
Если возникает необходимость более длинных кортежей, хотя, на мой взгляд, это вероятнее ошибка в логике программы, есть решение. Переопределим расширенный кортеж:

C# highlight
using System;

namespace TouplesTest
{
    class Program
    {
        // Данный метод возвращает кортеж с 4-мя
        // разными значениями
        static Tuple<int, float, string, char> Corteg(int a, string name)
        {
            int sqr = a * a;
            float sqrt = (float)(Math.Sqrt(a));
            string s = "Привет HPC от " + name + "!";
            char ch = (char)(name[0]);

            return Tuple.Create<int, float, string, char>(sqr, sqrt, s, ch);
        }

        static void Main(string[] args)
        {
            var myTuple = Corteg(25, "Fangarh");

            // Создаем кортеж произвольной размерности
            var myTuple2 = Tuple.Create<int, char, string, decimal, float, 
                           byte, short, Tuple<int,float, string, char>>
                           (12, 'C', "Name", 12.3892m, 0.5f, 120, 4501, myTuple);

            Console.WriteLine("{0}\n25 в квадрате: {1}\nКвадратный корень из 25: "
                + "{2}\nПервый символ в имени: {3}\n", myTuple2.Rest.Item1.Item3,
                myTuple2.Rest.Item1.Item1, myTuple2.Rest.Item1.Item2,
                myTuple2.Rest.Item1.Item4);


            Console.ReadLine();
        }

    }

    public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>
    {
    }
}
__________________
Live long and prosper.
Пользователь вне форума    
Наши Спонсоры
 

 

Часовой пояс GMT +2
Powered by vBulletin® 3.x.x Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Copyright © 2008 - 2013 «HPC» Реклама на сайте Правила Форума Пользовательское соглашение Работа на сайте
При копировании материалов ставьте ссылку на источник
Все материалы представлены только в ознакомительных целях, администрация за их использование ответственности не несет.