এক পদ্ধতি কলারে একাধিক মান ফিরিয়ে দিন


উত্তর:


609

সি # 7 এবং উপরে, এই উত্তরটি দেখুন

পূর্ববর্তী সংস্করণগুলিতে, আপনি .NET 4.0 + এর টিপল ব্যবহার করতে পারেন :

উদাহরণ স্বরূপ:

public Tuple<int, int> GetMultipleValue()
{
     return Tuple.Create(1,2);
}

দুটি মান সহ টিপলগুলির বৈশিষ্ট্য Item1এবং Item2রয়েছে।


8
এটি খুব সুন্দর হবে যদি আইটেম 1, আইটেম 2 এবং এর পরিবর্তে কেউ নামযুক্ত আউটপুট মান ব্যবহার করতে পারে। সি # 7 সম্ভবত এটি সরবরাহ করতে যাচ্ছে
Sнаđошƒаӽ

1
@ Sнаđошƒаӽ একেবারে ঠিক এটি আসন্ন সি # 7.0 তে যেমন একটি সিনট্যাক্স ব্যবহার করে সমর্থন করা হবে বলে আশা করা যায়: public (int sum, int count) GetMultipleValues() { return (1, 2); }এটি আমাদের ডকুমেন্টেশন বিষয়টির উদাহরণ থেকে নেওয়া হয়েছিল ।
জেপ্প স্টিগ নীলসন

435

এখন যে সি # 7 প্রকাশিত হয়েছে, আপনি নতুন অন্তর্ভুক্ত টিপলস সিনট্যাক্স ব্যবহার করতে পারেন

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

যা তখন এভাবে ব্যবহার করা যেতে পারে:

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

আপনি নিজের উপাদানগুলিকেও নাম সরবরাহ করতে পারেন (যাতে তারা "আইটেম 1", "আইটেম 2" ইত্যাদি নয়)। আপনি স্বাক্ষর বা রিটার্ন পদ্ধতিতে একটি নাম যুক্ত করে এটি করতে পারেন:

(string first, string middle, string last) LookupName(long id) // tuple elements have names

অথবা

return (first: first, middle: middle, last: last); // named tuple elements in a literal

এগুলি ডিকনস্ট্রাক্ট করা যায় যা এটি একটি দুর্দান্ত সুন্দর নতুন বৈশিষ্ট্য:

(string first, string middle, string last) = LookupName(id1); // deconstructing declaration

পরীক্ষা করে দেখুন এই লিঙ্কে কি করা যেতে পারে উপর আরো উদাহরণ দেখতে :)


11
আপনি যদি নেট নেট ফ্রেমওয়ার্ক ৪.7 বা। নেট কোর ২.০ এর চেয়েও বেশি আগে টার্গেট করে থাকেন তবে আপনাকে একটি নিউগেট প্যাকেজ ইনস্টল করতে হবে
ফিল

1
রিটার্ন পেতে আপনি এটি করতে পারেন: "var ফলাফল = লুকআপনেম (5); কনসোল.উরাইটলাইন (ফলাফল.মিডাল)"।
alansiqueira27

204

আপনি তিনটি বিভিন্ন উপায়ে ব্যবহার করতে পারেন

1. রেফ / আউট প্যারামিটার

রেফ ব্যবহার করে:

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add = 0;
    int multiply = 0;
    Add_Multiply(a, b, ref add, ref multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, ref int add, ref int multiply)
{
    add = a + b;
    multiply = a * b;
}

ব্যবহার করে:

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add;
    int multiply;
    Add_Multiply(a, b, out add, out multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, out int add, out int multiply)
{
    add = a + b;
    multiply = a * b;
}

2. কাঠামো / শ্রেণি

কাঠামো ব্যবহার:

struct Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

ক্লাস ব্যবহার:

class Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

3. টিপল

টুপল ক্লাস

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.Item1);
    Console.WriteLine(result.Item2);
}

private static Tuple<int, int> Add_Multiply(int a, int b)
{
    var tuple = new Tuple<int, int>(a + b, a * b);
    return tuple;
}

সি # 7 টিপলস

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    (int a_plus_b, int a_mult_b) = Add_Multiply(a, b);
    Console.WriteLine(a_plus_b);
    Console.WriteLine(a_mult_b);
}

private static (int a_plus_b, int a_mult_b) Add_Multiply(int a, int b)
{
    return(a + b, a * b);
}

3
কেবল আমার নিজের সৌজন্যতার জন্য, আপনি কী বলবেন দ্রুত এবং 'সেরা অনুশীলন'?
নেটফেরেট

:) জন্য 'struct হয় ব্যবহার' সেরা উদাহরণ
শেখর SHETE

1
সি # 7 এর সিনট্যাক্স যুক্ত করার পরামর্শ দিচ্ছে (এবং আরও বেশি লোক এটিকে ভোট দেয় :))
টোমম

আপনার তথ্যের জন্য, একটি ছোট (অপ্রাসঙ্গিক) টাইপো: কাঠামো / শ্রেণীর সমাধানগুলিতে আপনি মিশ্র / গুণিত মিশ্রিত করেছেন।
Szak1

আমি জানতাম না সি # টিউপল সিনট্যাক্স একটি জিনিস! কয়েক বছর পরও নতুন কিছু শিখুন!
jhaagsma

75

আপনি সি # তে এটি করতে পারবেন না। আপনি যা করতে পারেন তা হল একটি outপ্যারামিটার রয়েছে বা আপনার নিজস্ব ক্লাসটি ফেরত দেওয়া (বা স্ট্রাক্ট যদি আপনি এটি অপরিবর্তনীয় হতে চান তবে)।

পরামিতি ব্যবহার করে
public int GetDay(DateTime date, out string name)
{
  // ...
}
কাস্টম ক্লাস (বা স্ট্রাক্ট) ব্যবহার করে
public DayOfWeek GetDay(DateTime date)
{
  // ...
}

public class DayOfWeek
{
  public int Day { get; set; }
  public string Name { get; set; }
}

24
এই ক্ষেত্রে বিকল্প হ'ল রিটার্নের ধরণের জন্য ক্লাসের পরিবর্তে স্ট্রাক্ট ব্যবহার করা। যদি রিটার্ন মান মানহীন এবং ক্ষণস্থায়ী হয় তবে স্ট্রাক্ট আরও ভাল পছন্দ।
মাইকেল Meadows

1
asyncপদ্ধতি দ্বারা এটি সম্ভব নয় । Tupleযাবার উপায় (আমি ব্যবহার outতারা প্রকৃতপক্ষে যাদের ক্ষেত্রে উপযোগী সমলয় অপারেশনে পরামিতি যদিও।)
Codefun64

5
এটি এখন সি # 7: (অভ্যন্তরীণ, অভ্যন্তরীণ) পদ্ধতিতে () {রিটার্ন (1, 2) এ সম্ভব; }
ভূত

4
উত্তর আপডেট করা দরকার, এটি সি # এর সাম্প্রতিক সংস্করণগুলির সাথে ভুল হয়ে গেছে। আপডেট করা হলে ডাউনভোটকে আপভোটে পরিবর্তন করা হবে।
হিটনিল্যান্ড

লিগ্যাসি কোড বেসে কাজ করা, একটি কাস্টম ক্লাস ফিরিয়ে দেওয়া আমার পক্ষে একটি দৃ approach় পন্থা।
ব্রেন্ট

38

যদি আপনি একাধিক মান প্রত্যাবর্তন বোঝাতে চান তবে আপনি যে মানগুলি ফিরিয়ে দিতে চান সেগুলি সহ একটি শ্রেণি / কাঠামো দিতে পারেন বা আপনার প্যারামিটারগুলিতে "আউট" কীওয়ার্ডটি ব্যবহার করতে পারেন:

public void Foo(int input, out int output1, out string output2, out string errors) {
    // set out parameters inside function
}

2
আমি "আউট" বা "রেফ" ব্যবহার করা ভাল বলে মনে করি না —— কারণ এটি আপনার নিজের শ্রেণীর ধরণের কোনও রিটার্ন-মান দ্বারা সম্পূর্ণ প্রতিস্থাপন করা যেতে পারে। আপনি দেখতে পাচ্ছেন, যদি "রেফ" ব্যবহার করেন তবে এই জাতীয় পরামিতিগুলি কীভাবে বরাদ্দ করবেন? (এটি কেবল কীভাবে ভিতরে কোড করবেন তার উপর নির্ভর করে)। যদি ফাংশনটির মূল অংশটিতে, লেখক "রেফ" দিয়ে প্যারামিটারে একটি "নতুন" তৈরি করেছেন, এর অর্থ আপনি সেখানে কেবল "ননযোগ্য" মানটি পাস করতে পারেন। অন্যান্য কথা না। সুতরাং এটি একটি সামান্য পরিবেষ্টিত। এবং আমাদের আরও ভাল উপায় আছে (১. আপনার মালিকানাধীন শ্রেণিটি ফিরিয়ে নেওয়া, ২ টার্পল)।

33

আগের পোস্টারটি ঠিক is আপনি একটি সি # পদ্ধতি থেকে একাধিক মান ফেরত দিতে পারবেন না। তবে আপনার কাছে কয়েকটি বিকল্প রয়েছে:

  • এমন এক কাঠামো ফিরুন যাতে একাধিক সদস্য থাকে
  • কোনও শ্রেণীর উদাহরণ দিন
  • আউটপুট প্যারামিটার ব্যবহার করুন ( আউট বা রেফার কিওয়ার্ড ব্যবহার করে )
  • আউটপুট হিসাবে একটি অভিধান বা কী-মান জুড়ি ব্যবহার করুন

এখানকার সুবিধাগুলি প্রায়শই খুঁজে পাওয়া শক্ত। যদি আপনি কোনও কাঠামো ফিরে পান তবে নিশ্চিত হন এটি ছোট কারণ স্ট্রাক্টগুলি মান ধরণের এবং স্ট্যাকের উপর দিয়ে গেছে। আপনি যদি কোনও শ্রেণীর উদাহরণ ফিরিয়ে দেন তবে এখানে কিছু নকশার নিদর্শন রয়েছে যা আপনি সমস্যা সৃষ্টি করতে এড়াতে ব্যবহার করতে চাইতে পারেন - শ্রেণীর সদস্যদের সংশোধন করা যেতে পারে কারণ সি # রেফারেন্স দ্বারা অবজেক্টগুলি পাস করে (আপনার ভিভিতে আপনার মতো ভিবি নেই )।

অবশেষে আপনি আউটপুট প্যারামিটারগুলি ব্যবহার করতে পারেন তবে আমি যখন আপনি কেবলমাত্র একটি দম্পতি (3 বা তার চেয়ে কম) পরামিতিগুলি ব্যবহার করেন তখন আমি এটির ব্যবহারের পরিস্থিতিগুলিতে সীমাবদ্ধ রাখি - অন্যথায় জিনিসগুলি কুৎসিত এবং বজায় রাখা শক্ত হয়ে যায়। এছাড়াও, আউটপুট প্যারামিটারগুলির ব্যবহার চঞ্চলতার প্রতিবন্ধক হতে পারে কারণ আপনার পদ্ধতির স্বাক্ষরটি প্রতিবার যখন আপনাকে কোনও রিটার্ন ভ্যালুতে যুক্ত করতে হয় তখন কোনও স্ট্রাক্ট বা শ্রেণীর উদাহরণ ফিরিয়ে আপনি মেথড সিগনেচার পরিবর্তন না করে সদস্যদের যুক্ত করতে পারেন change

একটি স্থাপত্য দৃষ্টিকোণ থেকে আমি কী-মান জোড় বা অভিধান ব্যবহার করার বিরুদ্ধে সুপারিশ করব against আমি কোডিংয়ের এই স্টাইলটির পদ্ধতিতে গ্রাসকারী কোডটিতে "গোপন জ্ঞান" প্রয়োজন। কীগুলি কী হতে চলেছে এবং মানগুলির অর্থ কী হবে তা আগেই এটি অবশ্যই জেনে রাখা উচিত এবং যদি অভ্যন্তরীণ বাস্তবায়নে কাজ করা বিকাশকারী অভিধান বা কেভিপি তৈরির পদ্ধতি পরিবর্তন করে তবে এটি সহজেই পুরো অ্যাপ্লিকেশনটিতে ব্যর্থতা ক্যাসকেড তৈরি করতে পারে।


আপনি Exceptionযে দ্বিতীয় মানটি ফিরিয়ে দিতে চান তা প্রথমটির থেকে বিচ্ছিন্ন হলে আপনি এটিও ফেলে দিতে পারেন: যেমন আপনি যখন একধরনের সফল মান, বা এক ধরণের অসফল মানকে ফিরে আসতে চান।
সিউর

21

আপনি হয় কোনও শ্রেণীর উদাহরণ ফেরান বা প্যারামিটার ব্যবহার করেন । আউট প্যারামিটারগুলির উদাহরণ এখানে:

void mymethod(out int param1, out int param2)
{
    param1 = 10;
    param2 = 20;
}

এটিকে কল করুন:

int i, j;
mymethod(out i, out j);
// i will be 20 and j will be 10

3
মনে রাখবেন, যদিও এটি কেবল আপনি পারবেন, এর অর্থ এই নয় যে আপনার এটি করা উচিত। । নেট বেশিরভাগ ক্ষেত্রেই এটি খারাপ অভ্যাস হিসাবে ব্যাপকভাবে গৃহীত হয়।
মাইকেল মিডোস

4
আপনি কী ব্যাখ্যা করতে পারেন কেন এটি একটি খারাপ অভ্যাস?
জো

এটি সি / সি ++ এ খারাপ অভ্যাস। সমস্যাটি হচ্ছে "পার্শ্ব প্রতিক্রিয়া দ্বারা প্রোগ্রামিং": ইন গেটলেন্থ (চর * গুলি) n int n = 0; যখন (গুলি [n]! = '\ 0') এন ++; s [1] = 'এক্স'; রিটার্ন (এন); main int main () {চর অভিবাদন [5] = {'এইচ', 'ই', 'l', 'পি', '\ 0'}; int len ​​= getLength (অভিবাদন); cout << লেন << ":" << অভিবাদন; // আউটপুট: 5: এইচএক্সএলপিএল C সি # তে আপনাকে লিখতে হবে: int len ​​= getLength (শুভেচ্ছা জানাতে) যা "আরে, আপনি এই কল করার পরে অভিবাদন একই রকম হবে না" এর একটি বড় সতর্কতা পতাকা সংকেত দেবে এবং ব্যাপকভাবে বাগ কমাতে।
ডাস্টিন_00

19

অনেক উপায় আছে; তবে আপনি যদি কোনও নতুন অবজেক্ট বা কাঠামো বা এ জাতীয় কিছু তৈরি করতে না চান তবে আপনি সি # 7.0 এর পরে নীচের মতো করতে পারেন :

 (string firstName, string lastName) GetName(string myParameter)
    {
        var firstName = myParameter;
        var lastName = myParameter + " something";
        return (firstName, lastName);
    }

    void DoSomethingWithNames()
    {
        var (firstName, lastName) = GetName("myname");

    }

13

সি # 7 এ একটি নতুন Tupleবাক্য গঠন রয়েছে:

static (string foo, int bar) GetTuple()
{
    return ("hello", 5);
}

আপনি এটি রেকর্ড হিসাবে ফিরিয়ে দিতে পারেন:

var result = GetTuple();
var foo = result.foo
// foo == "hello"

আপনি নতুন ডিকনস্ট্রাক্টর সিনট্যাক্সও ব্যবহার করতে পারেন:

(string foo) = GetTuple();
// foo == "hello"

তবে ধারাবাহিকতাতে থেকে সতর্ক থাকুন, এই সব অন্বিত চিনি - প্রকৃত কম্পাইল কোডে এই হতে হবে একটি Tuple<string, int>(যেমন গৃহীত উত্তর প্রতি ) সঙ্গে Item1এবং Item2পরিবর্তে fooএবং bar। তার মানে সিরিয়ালাইজেশন (বা deserialisation) পরিবর্তে property সম্পত্তিগুলির নাম ব্যবহার করবে।

সুতরাং, সিরিয়ালাইজেশন জন্য একটি রেকর্ড ক্লাস ঘোষণা এবং পরিবর্তে ফিরে।

সি # 7-তে নতুন হ'ল outপ্যারামিটারগুলির জন্য উন্নত বাক্য গঠন । আপনি এখন ইনলাইনটি ঘোষণা করতে পারেন out, যা কিছু প্রসঙ্গে উপযুক্ত:

if(int.TryParse("123", out int result)) {
    // Do something with result
}

তবে, বেশিরভাগ ক্ষেত্রে আপনি নিজের ফাংশনগুলির পরিবর্তে এটি নেট নেট লাইব্রেরিতে ব্যবহার করবেন।


দয়া করে নোট করুন, আপনি যে নেট সংস্করণটিকে টার্গেট করছেন তার উপর নির্ভর করে আপনার নুগেট প্যাকেজ সিস্টেম ইনস্টল করার প্রয়োজন হতে পারে alভ্যালুআপল।
লিচ্ট

আমি উপরে হিসাবে উত্তর দিতে
যাচ্ছিলাম

12

কিছু উত্তর প্যারামিটারগুলি ব্যবহার করার পরামর্শ দেয় তবে আমি এটি ব্যবহার না করার পরামর্শ দিচ্ছি কারণ তারা অ্যাসিঙ্ক পদ্ধতিতে কাজ করে না । দেখুন এই আরও তথ্যের জন্য।

অন্যান্য উত্তরগুলি টিপল ব্যবহার করে বর্ণিত, যা আমি খুব সুপারিশ করব তবে সি # 7.0 তে নতুন বৈশিষ্ট্যটি ব্যবহার করে।

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

আরও তথ্য এখানে পাওয়া যাবে


11

এই কাজ করার বিভিন্ন উপায় আছে। আপনি refপরামিতি ব্যবহার করতে পারেন :

int Foo(ref Bar bar) { }

এটি ফাংশনটির একটি রেফারেন্স পাস করে যার মাধ্যমে ফাংশনটিকে কলিং কোডের স্ট্যাকের মধ্যে অবজেক্টটি সংশোধন করতে দেওয়া হয়। যদিও এটি প্রযুক্তিগতভাবে "ফেরত" মান নয় তবে এটি কোনও ফাংশনকে অনুরূপ কিছু করার একটি উপায়। উপরের কোডে ফাংশনটি একটি intএবং (সম্ভাব্য) পরিবর্তিত করবে bar

আর একটি অনুরূপ পদ্ধতির একটি outপরামিতি ব্যবহার করা হয়। একটি outপ্যারামিটার refঅতিরিক্ত, সংকলক প্রয়োগকারী বিধি সহ একটি পরামিতিটির সমান । এই নিয়মটি হ'ল যদি আপনি outকোনও ফাংশনে কোনও প্যারামিটারটি পাস করেন তবে ফিরে আসার আগে সেই ফাংশনটির মান নির্ধারণ করা দরকার। এই নিয়ম ছাড়াও, একটি outপ্যারামিটার প্যারামিটারের মতো কাজ করে ref

চূড়ান্ত পদ্ধতির (এবং বেশিরভাগ ক্ষেত্রে সর্বোত্তম) হ'ল এমন একটি প্রকার তৈরি করা যা উভয় মানকেই অন্তর্ভুক্ত করে এবং ফাংশনটিকে ফিরে আসতে দেয়:

class FooBar 
{
    public int i { get; set; }
    public Bar b { get; set; }
}

FooBar Foo(Bar bar) { }

এই চূড়ান্ত পদ্ধতির পড়া এবং বুঝতে সহজ এবং সহজ।


11

না, আপনি সি # তে কোনও ফাংশন (সি # 7 এর চেয়ে কম সংস্করণের জন্য) থেকে একাধিক মান ফিরিয়ে দিতে পারবেন না, পাইথনে অন্তত আপনি যেভাবে করতে পারবেন তা নয়।

তবে কয়েকটি বিকল্প রয়েছে:

আপনি এটিতে চান এমন একাধিক মান সহ আপনি টাইপের অবজেক্টের অ্যারেটি ফিরিয়ে দিতে পারেন।

private object[] DoSomething()
{
    return new [] { 'value1', 'value2', 3 };
}

আপনি outপরামিতি ব্যবহার করতে পারেন ।

private string DoSomething(out string outparam1, out int outparam2)
{
    outparam1 = 'value2';
    outparam2 = 3;
    return 'value1';
}

10

সি # 4 এ, আপনি সহজেই এটি পরিচালনা করতে টিউপসগুলিতে অন্তর্নির্মিত সমর্থনটি ব্যবহার করতে সক্ষম হবেন।

এর মধ্যে, দুটি বিকল্প রয়েছে।

প্রথমে, আপনি আপনার পরামিতিগুলিতে মান নির্ধারণের জন্য রেফ বা আউট প্যারামিটার ব্যবহার করতে পারেন, যা কলিং রুটিনে ফিরে আসে।

এটির মতো দেখাচ্ছে:

void myFunction(ref int setMe, out int youMustSetMe);

দ্বিতীয়ত, আপনি আপনার রিটার্নের মানগুলি কোনও কাঠামো বা শ্রেণিতে গুটিয়ে রাখতে পারেন এবং সেগুলি কাঠামোর সদস্য হিসাবে ফিরিয়ে দিতে পারেন। কীভ্যালুপায়ার 2 টির জন্য ভাল কাজ করে - 2 টিরও বেশির জন্য আপনার কাস্টম ক্লাস বা কাঠামো প্রয়োজন।


7

আপনি এই "কীভ্যালু পেয়ার" চেষ্টা করতে পারেন

private KeyValuePair<int, int> GetNumbers()
{
  return new KeyValuePair<int, int>(1, 2);
}


var numbers = GetNumbers();

Console.WriteLine("Output : {0}, {1}",numbers.Key, numbers.Value);

আউটপুট:

আউটপুট: 1, 2


5

শ্রেণি, কাঠামো, সংগ্রহ এবং অ্যারে একাধিক মান থাকতে পারে। আউটপুট এবং রেফারেন্স পরামিতি এছাড়াও একটি ফাংশনে সেট করা যেতে পারে। একাধিক মান ফিরিয়ে দেওয়া টিউপসগুলির মাধ্যমে গতিময় এবং কার্যকরী ভাষায় সম্ভব, তবে সি # তে নয়।


4

প্রধানত দুটি পদ্ধতি রয়েছে। ১. আউট / রেফ প্যারামিটারগুলি ব্যবহার করুন ২. বস্তুর একটি অ্যারে ফিরিয়ে দিন


টিউপসগুলির জন্য সিনট্যাকটিক চিনি হিসাবে টিপলস এবং একাধিক রিটার্ন মান রয়েছে।
ANeves

4

এখানে বেসিক Twoপদ্ধতি:

1) outপ্যারামিটার হিসাবে ' ' ব্যবহার করুন ব্যবহার আপনি 4.0 এবং ছোট উভয় সংস্করণের জন্যও 'আউট' ব্যবহার করতে পারেন।

'আউট' এর উদাহরণ:

using System;

namespace out_parameter
{
  class Program
   {
     //Accept two input parameter and returns two out value
     public static void rect(int len, int width, out int area, out int perimeter)
      {
        area = len * width;
        perimeter = 2 * (len + width);
      }
     static void Main(string[] args)
      {
        int area, perimeter;
        // passing two parameter and getting two returning value
        Program.rect(5, 4, out area, out perimeter);
        Console.WriteLine("Area of Rectangle is {0}\t",area);
        Console.WriteLine("Perimeter of Rectangle is {0}\t", perimeter);
        Console.ReadLine();
      }
   }
}

আউটপুট:

আয়তক্ষেত্রের ক্ষেত্রফল 20

আয়তক্ষেত্রের পরিধি 18

* দ্রষ্টব্য: * out-শব্দটি এমন পরামিতিগুলি বর্ণনা করে যার প্রকৃত পরিবর্তনশীল অবস্থানগুলি কল করা পদ্ধতির স্ট্যাকের অনুলিপি করা হয়েছে, যেখানে সেই একই অবস্থানগুলি পুনরায় লেখা যেতে পারে। এর অর্থ হ'ল কলিং পদ্ধতিটি পরিবর্তিত প্যারামিটারটি অ্যাক্সেস করবে।

2) Tuple<T>

টিপলের উদাহরণ:

একাধিক ডেটা টাইপ মান ব্যবহার করে ফিরিয়ে দেওয়া Tuple<T>

using System;

class Program
{
    static void Main()
    {
    // Create four-item tuple; use var implicit type.
    var tuple = new Tuple<string, string[], int, int[]>("perl",
        new string[] { "java", "c#" },
        1,
        new int[] { 2, 3 });
    // Pass tuple as argument.
    M(tuple);
    }

    static void M(Tuple<string, string[], int, int[]> tuple)
    {
    // Evaluate the tuple's items.
    Console.WriteLine(tuple.Item1);
    foreach (string value in tuple.Item2)
    {
        Console.WriteLine(value);
    }
    Console.WriteLine(tuple.Item3);
    foreach (int value in tuple.Item4)
    {
        Console.WriteLine(value);
    }
    }
}

আউটপুট

perl
java
c#
1
2
3

দ্রষ্টব্য: টুপলের ব্যবহার ফ্রেমওয়ার্ক ৪.০ এবং এর থেকে উপরে কার্যকরTupleপ্রকার a class। এটি মেমোরিতে পরিচালিত হিপগুলিতে পৃথক স্থানে বরাদ্দ করা হবে। আপনি একবার এটি তৈরি করলে আপনি Tupleএর মান পরিবর্তন করতে পারবেন না fields। এটি Tupleআরও একটি মত করে তোলে struct


4
<--Return more statements like this you can --> 

public (int,string,etc) Sample( int a, int b)  
{
    //your code;
    return (a,b);  
}

আপনি যেমন কোড গ্রহণ করতে পারেন

(c,d,etc) = Sample( 1,2);

আমি আশা করি এটা কাজ করে.


3

একটি প্রতিনিধি গ্রহণ করার পদ্ধতি কলকারীকে একাধিক মান সরবরাহ করতে পারে। এটি আমার উত্তর থেকে এখানে ধার করে এবং হাদাসের গৃহীত উত্তর থেকে কিছুটা ব্যবহার করে ।

delegate void ValuesDelegate(int upVotes, int comments);
void GetMultipleValues(ValuesDelegate callback)
{
    callback(1, 2);
}

কলকারীরা একটি ল্যাম্বদা (বা একটি নামযুক্ত ফাংশন) সরবরাহ করে এবং ইন্টেলিজেন্স প্রতিনিধি থেকে পরিবর্তনশীল নামগুলি অনুলিপি করে সহায়তা করে।

GetMultipleValues((upVotes, comments) =>
{
     Console.WriteLine($"This post has {upVotes} Up Votes and {comments} Comments.");
});

2

কেবল ওওপি পদ্ধতিতে এই জাতীয় ক্লাস ব্যবহার করুন:

class div
{
    public int remainder;

    public int quotient(int dividend, int divisor)
    {
        remainder = ...;
        return ...;
    }
}

ফাংশন সদস্য সেই ভাগফলটি ফিরিয়ে দেয় যা বেশিরভাগ কলাররা প্রাথমিকভাবে আগ্রহী Additionally

এইভাবে আপনার অনেক অতিরিক্ত "রিটার্ন মান" থাকতে পারে, যদি আপনি ডাটাবেস বা নেটওয়ার্কিং কলগুলি প্রয়োগ করেন, যেখানে প্রচুর ত্রুটি বার্তাগুলির প্রয়োজন হতে পারে তবে কেবল ত্রুটি দেখা দিলে।

আমি এই সমাধানটি সি ++ প্রশ্নের মধ্যেও লিখেছি যা ওপি উল্লেখ করছে।


2

এই নিবন্ধ থেকে , আপনি উপরে পোস্ট হিসাবে তিনটি বিকল্প ব্যবহার করতে পারেন।

কীভ্যালিউপায়ারটি দ্রুততম উপায়।

আউট দ্বিতীয় হয়।

টিপল সবচেয়ে ধীর।

যাইহোক, এটি আপনার দৃশ্যের জন্য সেরা কি তার উপর নির্ভরশীল।


2

সি # এর ভবিষ্যত সংস্করণে নামযুক্ত টিপলস অন্তর্ভুক্ত হতে চলেছে। ডেমোটির জন্য এই চ্যানেল 9 সেশনটি দেখুন https://channel9.msdn.com/Events/Build/2016/B889

টিপল স্টাফের জন্য 13:00 এ যান। এটি এই জাতীয় জিনিসগুলিকে অনুমতি দেবে:

(int sum, int count) Tally(IEnumerable<int> list)
{
// calculate stuff here
return (0,0)
}

int resultsum = Tally(numbers).sum

(ভিডিও থেকে অসম্পূর্ণ উদাহরণ)


2

আপনি একটি গতিশীল অবজেক্ট ব্যবহার করতে পারেন। আমি মনে করি এটি টিপলের চেয়ে আরও ভাল পঠনযোগ্যতা রয়েছে।

static void Main(string[] args){
    var obj = GetMultipleValues();
    Console.WriteLine(obj.Id);
    Console.WriteLine(obj.Name);
}

private static dynamic GetMultipleValues() {
    dynamic temp = new System.Dynamic.ExpandoObject();
    temp.Id = 123;
    temp.Name = "Lorem Ipsum";
    return temp;
}

3
আপনি কম্পাইল সময় টাইপ চেকিং হারান।
মিশা উইডেনম্যান

1

এটি করার উপায়:

1) কীভ্যালিউপায়ার (সেরা পারফরম্যান্স - 0.32 এনএস):

    KeyValuePair<int, int> Location(int p_1, int p_2, int p_3, int p_4)
    {                 
         return new KeyValuePair<int,int>(p_2 - p_1, p_4-p_3);
    }

2) টিপল - 5.40 এনএস:

    Tuple<int, int> Location(int p_1, int p_2, int p_3, int p_4)
    {
          return new Tuple<int, int>(p_2 - p_1, p_4-p_3);
    }

3) আউট (1.64 এনএস) বা রেফ 4) আপনার নিজস্ব কাস্টম ক্লাস / স্ট্রাক্ট তৈরি করুন

ns -> ন্যানোসেকেন্ডস

রেফারেন্স: একাধিক-রিটার্ন-মান


0

আপনি এটি চেষ্টা করতে পারেন

public IEnumerable<string> Get()
 {
     return new string[] { "value1", "value2" };
 }

1
এটি সত্যিই একাধিক মান ফেরত দেয় না । এটি একক, সংগ্রহের মান দেয় returns
ম্যাথু হগেন

এছাড়াও, কেন yield return "value1"; yield return "value2";স্পষ্টভাবে একটি নতুন তৈরি করতে হবে না হিসাবে ব্যবহার করবেন না string[]?
থমাস ফ্লিনকো

0

আপনি একটি অপারেশন রেজাল্টও ব্যবহার করতে পারেন

public OperationResult DoesSomething(int number1, int number2)
{
// Your Code
var returnValue1 = "return Value 1";
var returnValue2 = "return Value 2";

var operationResult = new OperationResult(returnValue1, returnValue2);
return operationResult;
}

-7

অ্যারের ধরণের রিটার্নগুলির জন্য বিশেষভাবে একটি দ্রুত উত্তর:

private int[] SumAndSub(int A, int B)
{
    return new[] { A + B, A - B };
}

ব্যবহার:

var results = SumAndSub(20, 5);
int sum = results[0];
int sub = results[1];

3
"প্রোগ্রামারদের সময় এবং অবিস্মরণীয় পদ্ধতি প্রয়োজন" বলতে কী বোঝায়?
থমাস ফ্লিনকো

2
আপনি দুবার ফলাফল ব্যবহার করেছেন [0] এটা কি এই ভুল একটি sympton এর
symbiont

1
এটি সম্পর্কে একটি সন্দেহ নেই যে একটি অবিস্মরণীয় উত্তর
লুইস তেজোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.