"আইটেম 1", "আইটেম 2" এর চেয়ে টুপল ক্লাসে নামকরণ ভাল


204

কোনও টুপল ক্লাস ব্যবহার করার কোনও উপায় আছে তবে এতে থাকা আইটেমগুলির নাম সরবরাহ করুন?

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

public Tuple<int, int, int int> GetOrderRelatedIds()

এটি অর্ডারগ্রুপআইড, অর্ডারটাইপআইডি, অর্ডারসুবটাইপআইডি এবং অর্ডার -রকিয়ারমেন্টআইডির জন্য আইডিগুলি দেয়।

আমার পদ্ধতির ব্যবহারকারীদের কাছে কোনটি তা জানাতে ভাল লাগবে। (আপনি যখন পদ্ধতিটি কল করেন তখন ফলাফলগুলি ফলাফল হয় tem আইটেম 1, ফলাফল.আইটেম 2, ফলাফল. আইটেম 3, ফলাফল. আইটেম 4 which কোনটি কোনটি তা পরিষ্কার নয়))

(আমি জানি আমি এই সমস্ত আইডি রাখার জন্য কেবল একটি ক্লাস তৈরি করতে পেরেছিলাম, তবে এই আইডির ইতিমধ্যে তাদের নিজস্ব ক্লাস রয়েছে যেখানে তারা থাকেন এবং এই পদ্ধতির ফেরতের মানটি বোকা বলে মনে হয়))


1
আপনাকে নিজের রোল করতে হবে - Tupleখুব জেনেরিক, তাই আপনারা যা পান
ব্রোকনগ্লাস

আপনি যা করতে পারেন না, আরও তথ্যের জন্য এই লিঙ্কটি দেখুন msdn.microsoft.com/en-us/vcsharp/ee957397
এনিগমা স্টেট

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

1
সেখানে এই বৈশিষ্ট্যটির জন্য ভোট দিন: ভিজ্যুজিস্টুডিও.ইউসারওয়্যস // ফোরামস
জন

4
এটি সি # 7 এর কার্যকারী তালিকায় রয়েছে github.com/dotnet/roslyn/issues/347
ফিলিপ ডিং

উত্তর:


277

সি # 7.0 (ভিজ্যুয়াল স্টুডিও 2017) তে এটি করার জন্য একটি নতুন নির্মাণ রয়েছে:

(string first, string middle, string last) LookupName(long id)

68
বাক্য গঠনটি হ'ল List<(int first, int second)>। ভিজুয়াল স্টুডিও 2017 এ কাজ করার জন্য আমাকে নুগেট থেকে সিস্টেম.ভ্যালিউটুপল প্যাকেজটি ডাউনলোড করতে হয়েছিল।
ম্যাট ডেভিস

14
মান তৈরি করতেreturn (first: first, middle: middle, last: last);
ফিয়াট

4
বা কেবলমাত্র: return (first, middle, last);নেট নেট 4.7.1 (4.7.0 এর জন্য নিশ্চিত নয়)
ওয়াটব্লিউবারিফ

1
এটি ব্যবহার করার জন্য আপনাকে সিস্টেম যোগ করতে হবে।ভ্যালিউটুপল নুগেট প্যাকেজ
অ্যালেক্স জি

11
এটি লক্ষ করা উচিত যে সি # 7 এর ValueTuple, সাধারণত দুর্দান্ত তবে একটি পরিবর্তনীয় মান ধরণের (স্ট্রাক্ট) হয়, যখন Tupleএকটি অপরিবর্তনীয় রেফারেন্স টাইপ (শ্রেণি)। আমি যতদূর জানি, Tupleবন্ধুত্বপূর্ণ আইটেমের নামগুলির সাথে কোনও রেফারেন্স টাইপ পাওয়ার কোনও উপায় নেই ।
dx_over_dt

51

সি # 7.0 অবধি, আপনার নিজের ধরণের সংজ্ঞা দেওয়ার জন্য এটি করার কোনও উপায় ছিল না।


13
আমি এই উত্তরটি 40 এর স্কোর সহ গৃহীত বলে বিশ্বাস করতে পারছি না const
bytecode77


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

3
সি # 7 প্রকাশিত হওয়ার পরে এটি করা সম্ভব হবে: এমএসডিএন.মাইক্রোসফটকম /en-us/magazine/mt595758.aspx
বুরাক কারাকুş

11
কিউ'র ট্যাগ হিসাবে সি # 4 রয়েছে, সুতরাং যদিও এই উত্তরটি সংক্ষিপ্ত হলেও এটি এখনও সঠিক।
স্টিভ ড্রেক

33

আপনি যা জিজ্ঞাসা করছেন তার একটি অতি জটিল সংস্করণ এখানে:

class MyTuple : Tuple<int, int>
{
    public MyTuple(int one, int two)
        :base(one, two)
    {

    }

    public int OrderGroupId { get{ return this.Item1; } }
    public int OrderTypeId { get{ return this.Item2; } }

}

কেন শুধু ক্লাস করবেন না?


2
ক্লাসের পরিবর্তে স্ট্রাক্ট কি আরও ভাল হতে পারে?
ডেথ্রেস

5
আমি এর সামান্য সুবিধাটি দেখি তা হ'ল এটি স্বয়ংক্রিয়ভাবে সমতুল্য অপারেটরটি প্রয়োগ করে, আইটেমগুলি সমস্ত সমান হলে 2 টি দৃষ্টান্ত সমান কিনা তা পরীক্ষা করে।
জেসোয়েট

8
এই পদ্ধতির আর একটি অপূর্ণতা হ'ল আইটেম 1 এবং আইটেম 2 এখনও মাইটিপল-এ সরকারী সম্পত্তি হিসাবে রয়েছে
আরজেফালকোনার

3
@ ডিথ্রেস টুপল নিজেরাই ক্লাস, সুতরাং আপনি যদি সরাসরি উত্তরাধিকারী হতে চান তবে আপনি স্ট্রাক Tuple<T, T2>হতে পারবেন না।
চক্রভা

3
আমি ভুল হতে পারি তবে আমি যেখানেই কোনও বস্তু ফিরে পেতে চাই সেখানে বেশিরভাগ ক্ষেত্রেই টুপল ব্যবহার করি তবে একটি নির্দিষ্ট শ্রেণির সংজ্ঞা দিতে চাই না ..
জয়

12

.NET 4 এর সাহায্যে আপনি সম্ভবত এটি দেখতে পারেন ExpandoObjectতবে এই সাধারণ ক্ষেত্রে এটি ব্যবহার করবেন না কারণ সংকলন-সময় ত্রুটিগুলি রান-টাইমের ত্রুটিগুলিতে পরিণত হত।

class Program
{
    static void Main(string[] args)
    {
        dynamic employee, manager;

        employee = new ExpandoObject();
        employee.Name = "John Smith";
        employee.Age = 33;

        manager = new ExpandoObject();
        manager.Name = "Allison Brown";
        manager.Age = 42;
        manager.TeamSize = 10;

        WritePerson(manager);
        WritePerson(employee);
    }
    private static void WritePerson(dynamic person)
    {
        Console.WriteLine("{0} is {1} years old.",
                          person.Name, person.Age);
        // The following statement causes an exception
        // if you pass the employee object.
        // Console.WriteLine("Manages {0} people", person.TeamSize);
    }
}
// This code example produces the following output:
// John Smith is 33 years old.
// Allison Brown is 42 years old.

অন্য কিছু উল্লেখ করার মতো বিষয় হ'ল কোনও পদ্ধতির মধ্যে একটি বেনামি ধরণ , তবে আপনি যদি এটি ফিরিয়ে দিতে চান তবে আপনার একটি শ্রেণি তৈরি করা দরকার।

var MyStuff = new
    {
        PropertyName1 = 10,
        PropertyName2 = "string data",
        PropertyName3 = new ComplexType()
    };

10

থেকে আমার উত্তর পুনরুত্পাদন এই পোস্ট হিসাবে এটি একটি ভাল হইয়া এখানে।

সি শার্প v7.0 থেকে শুরু করে, এখন এটি tuple বৈশিষ্ট্য যা আগের মত পূর্বনির্ধারিত নাম ডিফল্ট করার জন্য ব্যবহৃত নাম করা সম্ভব Item1, Item2ইত্যাদি।

টুপল লিটারেলের বৈশিষ্ট্যগুলির নামকরণ :

var myDetails = (MyName: "RBT_Yoga", MyAge: 22, MyFavoriteFood: "Dosa");
Console.WriteLine($"Name - {myDetails.MyName}, Age - {myDetails.MyAge}, Passion - {myDetails.MyFavoriteFood}");

কনসোলে আউটপুট:

নাম - আরবিT_ যোগ, বয়স - 22, প্যাশন - ডসা

একটি পদ্ধতি থেকে টিপল (নামযুক্ত বৈশিষ্ট্যযুক্ত) ফেরত :

static void Main(string[] args)
{
    var empInfo = GetEmpInfo();
    Console.WriteLine($"Employee Details: {empInfo.firstName}, {empInfo.lastName}, {empInfo.computerName}, {empInfo.Salary}");
}

static (string firstName, string lastName, string computerName, int Salary) GetEmpInfo()
{
    //This is hardcoded just for the demonstration. Ideally this data might be coming from some DB or web service call
    return ("Rasik", "Bihari", "Rasik-PC", 1000);
}

কনসোলে আউটপুট:

কর্মচারীর বিবরণ: রসিক, বিহারী, রসিক-পিসি, 1000

নামের বৈশিষ্ট্যযুক্ত টিপলগুলির একটি তালিকা তৈরি করা

var tupleList = new List<(int Index, string Name)>
{
    (1, "cow"),
    (5, "chickens"),
    (1, "airplane")
};

foreach (var tuple in tupleList)
    Console.WriteLine($"{tuple.Index} - {tuple.Name}");

কনসোল আউটপুট:

1 - গরু 5 - মুরগি 1 - বিমান

আমি আশা করি আমি সবকিছু আবরণ করেছি। সেক্ষেত্রে এমন কিছু আছে যা আমি মিস করেছি তবে আমাকে মন্তব্যে একটি প্রতিক্রিয়া জানান।

দ্রষ্টব্য : আমার কোড স্নিপেটগুলি এখানে বিস্তারিত হিসাবে C # v7 এর স্ট্রিং ইন্টারপোলেশন বৈশিষ্ট্য ব্যবহার করছে ।


3

মাইকেলমোকো উত্তরে দুর্দান্ত,

তবে আমি কয়েকটি জিনিস যুক্ত করতে চাই যা আমার বের করতে হয়েছিল

(string first, string middle, string last) LookupName(long id)

উপরের লাইনটি আপনাকে সঙ্কলনের সময় ত্রুটি দেবে যদি আপনি। নেট ফ্রেমওয়ার্ক <4.7 ব্যবহার করেন

সুতরাং আপনার যদি এমন একটি প্রকল্প রয়েছে যা। নেট ফ্রেমওয়ার্ক <4.7 ব্যবহার করছে এবং এখনও আপনি কাজের তুলনায় ভ্যালুআপল ব্যবহার করতে চান তবে এই নুগেট প্যাকেজটি ইনস্টল করা হবে would



2

যদি আপনার আইটেমগুলির প্রকারগুলি সমস্ত পৃথক হয়, তবে সেগুলি আরও স্বজ্ঞাগতভাবে পাওয়ার জন্য এখানে আমি তৈরি করা একটি শ্রেণি রয়েছে।

এই শ্রেণীর ব্যবহার:

var t = TypedTuple.Create("hello", 1, new MyClass());
var s = t.Get<string>();
var i = t.Get<int>();
var c = t.Get<MyClass>();

সোর্স কোড:

public static class TypedTuple
{
    public static TypedTuple<T1> Create<T1>(T1 t1)
    {
        return new TypedTuple<T1>(t1);
    }

    public static TypedTuple<T1, T2> Create<T1, T2>(T1 t1, T2 t2)
    {
        return new TypedTuple<T1, T2>(t1, t2);
    }

    public static TypedTuple<T1, T2, T3> Create<T1, T2, T3>(T1 t1, T2 t2, T3 t3)
    {
        return new TypedTuple<T1, T2, T3>(t1, t2, t3);
    }

    public static TypedTuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3, T4 t4)
    {
        return new TypedTuple<T1, T2, T3, T4>(t1, t2, t3, t4);
    }

    public static TypedTuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5)
    {
        return new TypedTuple<T1, T2, T3, T4, T5>(t1, t2, t3, t4, t5);
    }

    public static TypedTuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6)
    {
        return new TypedTuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6);
    }

    public static TypedTuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7)
    {
        return new TypedTuple<T1, T2, T3, T4, T5, T6, T7>(t1, t2, t3, t4, t5, t6, t7);
    }

    public static TypedTuple<T1, T2, T3, T4, T5, T6, T7, T8> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8)
    {
        return new TypedTuple<T1, T2, T3, T4, T5, T6, T7, T8>(t1, t2, t3, t4, t5, t6, t7, t8);
    }

}

public class TypedTuple<T>
{
    protected Dictionary<Type, object> items = new Dictionary<Type, object>();

    public TypedTuple(T item1)
    {
        Item1 = item1;
    }

    public TSource Get<TSource>()
    {
        object value;
        if (this.items.TryGetValue(typeof(TSource), out value))
        {
            return (TSource)value;
        }
        else
            return default(TSource);
    }

    private T item1;
    public T Item1 { get { return this.item1; } set { this.item1 = value; this.items[typeof(T)] = value; } }
}

public class TypedTuple<T1, T2> : TypedTuple<T1>
{
    public TypedTuple(T1 item1, T2 item2)
        : base(item1)
    {
        Item2 = item2;
    }

    private T2 item2;
    public T2 Item2 { get { return this.item2; } set { this.item2 = value; this.items[typeof(T2)] = value; } }
}

public class TypedTuple<T1, T2, T3> : TypedTuple<T1, T2>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3)
        : base(item1, item2)
    {
        Item3 = item3;
    }

    private T3 item3;
    public T3 Item3 { get { return this.item3; } set { this.item3 = value; this.items[typeof(T3)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4> : TypedTuple<T1, T2, T3>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4)
        : base(item1, item2, item3)
    {
        Item4 = item4;
    }

    private T4 item4;
    public T4 Item4 { get { return this.item4; } set { this.item4 = value; this.items[typeof(T4)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5> : TypedTuple<T1, T2, T3, T4>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
        : base(item1, item2, item3, item4)
    {
        Item5 = item5;
    }

    private T5 item5;
    public T5 Item5 { get { return this.item5; } set { this.item5 = value; this.items[typeof(T5)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5, T6> : TypedTuple<T1, T2, T3, T4, T5>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
        : base(item1, item2, item3, item4, item5)
    {
        Item6 = item6;
    }

    private T6 item6;
    public T6 Item6 { get { return this.item6; } set { this.item6 = value; this.items[typeof(T6)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5, T6, T7> : TypedTuple<T1, T2, T3, T4, T5, T6>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
        : base(item1, item2, item3, item4, item5, item6)
    {
        Item7 = item7;
    }

    private T7 item7;
    public T7 Item7 { get { return this.item7; } set { this.item7 = value; this.items[typeof(T7)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5, T6, T7, T8> : TypedTuple<T1, T2, T3, T4, T5, T6, T7>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
        : base(item1, item2, item3, item4, item5, item6, item7)
    {
        Item8 = item8;
    }

    private T8 item8;
    public T8 Item8 { get { return this.item8; } set { this.item8 = value; this.items[typeof(T8)] = value; } }
}

4
এটি অল্প কিছুটা বেতন না দেওয়ার মতো অনেক কাজ বলে মনে হচ্ছে। এটির একটি অনিচ্ছাকৃত সীমাবদ্ধতা রয়েছে (কোনও সদৃশ প্রকার নয়) এবং আমি কেবলমাত্র তার ধরণের দ্বারা কোনও মূল্য পুনরুদ্ধারের ধারণাটি অবিশ্বাস্যভাবে অপ্রচলিত এবং এটি ব্যবহারিক ব্যবহারের ক্ষেত্রে ভাবতে পারি না। এটি কর্মীদের জন্য ডেটা টেবিল তৈরির সমতুল্য, তারপরে কর্মীদের তাদের প্রথম নাম (কোনও অনন্য কী এর বিপরীতে) পুনরুদ্ধার করার সিদ্ধান্ত গ্রহণ এবং পরবর্তীকালে সমস্ত কর্মচারীদের আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা নাম থাকা দরকার। এটি কোনও সমস্যার সমাধান নয়, এটি একটি অতিরিক্ত সমস্যা তৈরি করতে ব্যয় করে একটি সমাধান ব্যবহার করে।
ফ্ল্যাটার

এবং আল্লাহ আপনার আত্মা দয়া করুন।
জেমি এম

1

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

Tuple<ApiResource, JSendResponseStatus> result = await SendApiRequest();
ApiResource apiResource = result.Item1;
JSendResponseStatus jSendStatus = result.Item2;

0

আমি মনে করি আমি একটি বর্গ তৈরি করব তবে অন্য বিকল্প হ'ল আউটপুট পরামিতি।

public void GetOrderRelatedIds(out int OrderGroupId, out int OrderTypeId, out int OrderSubTypeId, out int OrderRequirementId)

যেহেতু আপনার টিপলে কেবল পূর্ণসংখ্যা রয়েছে আপনি এটির সাথে এটি উপস্থাপন করতে পারেন Dictionary<string,int>

var orderIds = new Dictionary<string, int> {
    {"OrderGroupId", 1},
    {"OrderTypeId", 2},
    {"OrderSubTypeId", 3},
    {"OrderRequirementId", 4}.
};

তবে আমি তাও সুপারিশ করি না।


0

সবাই কেন জীবনকে এত কঠিন করে তুলছে। টিপলগুলি অস্থায়ী ডেটা প্রক্রিয়াকরণের জন্য। সারাক্ষণ টিপলসের সাথে কাজ করা কোনও সময় কোডটি বোঝা খুব কঠিন করে তুলবে। প্রতিটি কিছুর জন্য ক্লাস তৈরি করা শেষ পর্যন্ত আপনার প্রকল্পটি ফুলে উঠতে পারে।

এটি ভারসাম্য সম্পর্কে, যদিও ...

আপনার সমস্যাটি এমন কিছু বলে মনে হচ্ছে যার জন্য আপনি একটি ক্লাস চাইবেন। এবং কেবল সম্পূর্ণতার খাতিরে, এই শ্রেণীর নীচেও কনস্ট্রাক্টর রয়েছে।


এটি সঠিক প্যাটার্ন

  • একটি কাস্টম তথ্য প্রকার
    • আর কোনও কার্যকারিতা ছাড়াই। কার্যনির্বাহী কোড সম্পাদন করার সময়, "_র্ডারগ্রুপআইডি" নামের ধরণ দিয়ে বেসরকারী সদস্যদের পেতে / সেট করে কোডের সাহায্যে গেটার এবং সেটটারগুলিও প্রসারিত করা যায়।
  • কনস্ট্রাক্টর সহ। এছাড়াও আপনি মাত্র এক কন্সট্রাকটর যদি অন্তর্ভুক্ত করা চয়ন করতে পারেন সব সম্পত্তি বাধ্যতামূলক ।
  • আপনি যদি সমস্ত কন্সট্রাক্টর ব্যবহার করতে চান তবে ডুপ্লিকেট কোড এড়ানোর জন্য এ জাতীয় বুদবুদ হ'ল সঠিক প্যাটার্ন।

public class OrderRelatedIds
{
    public int OrderGroupId { get; set; }
    public int OrderTypeId { get; set; }
    public int OrderSubTypeId { get; set; }
    public int OrderRequirementId { get; set; }

    public OrderRelatedIds()
    {
    }
    public OrderRelatedIds(int orderGroupId)
        : this()
    {
        OrderGroupId = orderGroupId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId)
        : this(orderGroupId)
    {
        OrderTypeId = orderTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId)
        : this(orderGroupId, orderTypeId)
    {
        OrderSubTypeId = orderSubTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId, int orderRequirementId)
        : this(orderGroupId, orderTypeId, orderSubTypeId)
    {
        OrderRequirementId = orderRequirementId;
    }
}

বা, যদি আপনি এটি সত্যিই সহজ চান: আপনি প্রারম্ভিক আরম্ভকারীও ব্যবহার করতে পারেন:

OrderRelatedIds orders = new OrderRelatedIds
{
    OrderGroupId = 1,
    OrderTypeId = 2,
    OrderSubTypeId = 3,
    OrderRequirementId = 4
};

public class OrderRelatedIds
{
    public int OrderGroupId;
    public int OrderTypeId;
    public int OrderSubTypeId;
    public int OrderRequirementId;
}

0

আমি সংক্ষেপে আইটেমের নাম লিখব .. সুতরাং হেলিওর্ল্ড () ফাংশনটি ঘুরিয়ে পাঠ্যটি হ্যালো = আইটেম 1 এবং বিশ্ব = আইটেম 2 বলবে

 helloworld("Hi1,Hi2");

/// <summary>
/// Return hello = Item1 and world Item2
/// </summary>
/// <param name="input">string to split</param>
/// <returns></returns>
private static Tuple<bool, bool> helloworld(string input)
{
    bool hello = false;
    bool world = false;
    foreach (var hw in input.Split(','))
    {
        switch (hw)
        {
            case "Hi1":
                hello= true;
                break;
            case "Hi2":
                world= true;
                break;
        }

    }
    return new Tuple<bool, bool>(hello, world);
}

0

কেবলমাত্র @ মিশেলমোকো উত্তরটি যুক্ত করতে। এই মুহূর্তে টিপলসের কয়েকটি গোছা রয়েছে:

আপনি এএফ এক্সপ্রেশন ট্রিগুলিতে এগুলি ব্যবহার করতে পারবেন না

উদাহরণ:

public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        // Selecting as Tuple
        .Select(person => (person.Name, person.Surname))
        .First();
}

এটি "একটি অভিব্যক্তি ট্রিতে একটি টুপল আক্ষরিক নাও থাকতে পারে" ত্রুটি দিয়ে সংকলন করতে ব্যর্থ হবে। দুর্ভাগ্যক্রমে, ভাষাগুলিতে এগুলি যুক্ত করা হয় তখন টিপলসের সমর্থনে এক্সপ্রেশন ট্রি ট্রি API টি প্রসারিত হয়নি।

আপডেটগুলির জন্য এই ইস্যুটিকে ট্র্যাক করুন (এবং উত্তোলন করুন): https://github.com/dotnet/roslyn/issues/12897

সমস্যাটি পেতে, আপনি এটি প্রথমে বেনামে টাইপ করতে পারেন এবং তারপরে মানটিকে টুপলে রূপান্তর করতে পারেন:

// Will work
public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        .Select(person => new { person.Name, person.Surname })
        .ToList()
        .Select(person => (person.Name, person.Surname))
        .First();
}

আরেকটি বিকল্প হ'ল ভ্যালু টুপল ব্যবহার করুন re

// Will work
public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        .Select(person => ValueTuple.Create(person.Name, person.Surname))
        .First();
}

তথ্যসূত্র:

আপনি ল্যাম্বডাসে এগুলি ডিকনস্ট্রাক্ট করতে পারবেন না

সমর্থন যুক্ত করার প্রস্তাব রয়েছে: https://github.com/dotnet/csharplang/issues/258

উদাহরণ:

public static IQueryable<(string name, string surname)> GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        .Select(person => ValueTuple.Create(person.Name, person.Surname));
}

// This won't work
ctx.GetPersonName(id).Select((name, surname) => { return name + surname; })

// But this will
ctx.GetPersonName(id).Select(t => { return t.name + t.surname; })

তথ্যসূত্র:

তারা সুন্দরভাবে সিরিয়ালাইজ করবে না

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main() {
        var me = (age: 21, favoriteFood: "Custard");
        string json = JsonConvert.SerializeObject(me);

        // Will output {"Item1":21,"Item2":"Custard"}
        Console.WriteLine(json); 
    }
}

টুপল ফিল্ডের নামগুলি কেবল সংকলনের সময়ে পাওয়া যায় এবং রানটাইমের সময় সম্পূর্ণ মুছে ফেলা হয়।

তথ্যসূত্র:


-1

আপনি একটি ক্লাস লিখতে পারেন যাতে টুপল রয়েছে।

আপনাকে সমান এবং গেটহ্যাশকোড ফাংশনগুলি ওভাররাইড করতে হবে

এবং == এবং! = অপারেটর।

class Program
{
    public class MyTuple
    {
        private Tuple<int, int> t;

        public MyTuple(int a, int b)
        {
            t = new Tuple<int, int>(a, b);
        }

        public int A
        {
            get
            {
                return t.Item1;
            }
        }

        public int B
        {
            get
            {
                return t.Item2;
            }
        }

        public override bool Equals(object obj)
        {
            return t.Equals(((MyTuple)obj).t);
        }

        public override int GetHashCode()
        {
            return t.GetHashCode();
        }

        public static bool operator ==(MyTuple m1, MyTuple m2)
        {
            return m1.Equals(m2);
        }

        public static bool operator !=(MyTuple m1, MyTuple m2)
        {
            return !m1.Equals(m2);
        }
    }

    static void Main(string[] args)
    {
        var v1 = new MyTuple(1, 2);
        var v2 = new MyTuple(1, 2);

        Console.WriteLine(v1 == v2);

        Dictionary<MyTuple, int> d = new Dictionary<MyTuple, int>();
        d.Add(v1, 1);

        Console.WriteLine(d.ContainsKey(v2));
    }
}

ফিরে আসবে:

সত্য

সত্য


2
আপনি যদি ইতিমধ্যে এই ডেটা টাইপের জন্য কোনও শ্রেণি প্রয়োগ করে থাকেন তবে কেন আপনি কেবল বৈশিষ্ট্যগুলির পরিবর্তে অন্তর্নিহিত ডেটার জন্য একটি টিপল ঘোষণা করবেন?
bytecode77

আমি টিউপল বৈশিষ্ট্যটি এটির সাথে সমান ফাংশনটির সাথে তুলনা করে ব্যবহার করতে চাই
ss

এটি একটি বোনাস হতে পারে। তবে অন্যদিকে আপনি মূলত বৈশিষ্ট্যগুলি সহ আইটেম 1 থেকে আইটেমএক্স পর্যন্ত একটি শ্রেণি তৈরি করেছেন। আমি একটি টিউপল ব্যবহার করে সমান () এর মধ্যে সঠিক নামকরণ এবং আরও কোড বেছে নেব।
bytecode77

-1

সি # 7 টিউপল উদাহরণ

var tuple = TupleExample(key, value);

     private (string key1, long value1) ValidateAPIKeyOwnerId(string key, string value)
            {
                return (key, value);
            }
      if (!string.IsNullOrEmpty(tuple.key1) && tuple.value1 > 0)
          {
                    //your code

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