সি ++ এসডিডি :: জোড়ার সি # এনালগ কী?


284

আমি আগ্রহী: std::pairসি ++ এর সি # এর এনালগটি কী ? আমি System.Web.UI.Pairক্লাস পেয়েছি , তবে আমি টেম্পলেট ভিত্তিক কিছু পছন্দ করব prefer

ধন্যবাদ!


11
কিছুক্ষণ আগে আমার একই অনুরোধ ছিল, তবে আমি এটির বিষয়ে যত বেশি চিন্তা করেছি, আপনি জেনেরিক "ফার্স্ট" এবং "সেকেন্ড" এর পরিবর্তে সুস্পষ্ট শ্রেণীর প্রকার এবং ক্ষেত্রগুলি সহ কেবল নিজের জুটিবদ্ধ ক্লাসটি রোল করতে চাইতে পারেন। এটি আপনার কোডটিকে আরও পঠনযোগ্য করে তোলে। একটি জোড় শ্রেণি 4 টি লাইনের চেয়ে কম হতে পারে, তাই আপনি জেনেরিক জোড় <টি, ইউ> শ্রেণিটি পুনরায় ব্যবহার করে বেশি কিছু সঞ্চয় করছেন না এবং আপনার কোডটি আরও পঠনযোগ্য হবে।
লাকাটা

উত্তর:


325

টিপলগুলি .NET4.0 থেকে উপলব্ধ এবং জেনারিকগুলি সমর্থন করে:

Tuple<string, int> t = new Tuple<string, int>("Hello", 4);

পূর্ববর্তী সংস্করণগুলিতে আপনি System.Collections.Generic.KeyValuePair<K, V>নিম্নলিখিত ব্যবহারের মতো সমাধান ব্যবহার করতে পারেন :

public class Pair<T, U> {
    public Pair() {
    }

    public Pair(T first, U second) {
        this.First = first;
        this.Second = second;
    }

    public T First { get; set; }
    public U Second { get; set; }
};

এবং এটি এর মতো ব্যবহার করুন:

Pair<String, int> pair = new Pair<String, int>("test", 2);
Console.WriteLine(pair.First);
Console.WriteLine(pair.Second);

এই ফলাফলগুলি:

test
2

বা এমনকি এই শৃঙ্খলিত জোড়া:

Pair<Pair<String, int>, bool> pair = new Pair<Pair<String, int>, bool>();
pair.First = new Pair<String, int>();
pair.First.First = "test";
pair.First.Second = 12;
pair.Second = true;

Console.WriteLine(pair.First.First);
Console.WriteLine(pair.First.Second);
Console.WriteLine(pair.Second);

ফলাফল:

test
12
true

সমান পদ্ধতি যোগ করার বিষয়ে আমার পোস্টটি দেখুন
অ্যান্ড্রু স্টেইন

টিপল <> এখন আরও ভাল সমাধান।
dkantowitz

6
যেহেতু জেনেরিক শ্রেণীর অন্তর্ভুক্ত প্রকারের পরামিতিগুলি কোনও অবজেক্ট ক্রিয়েশন এক্সপ্রেশন (কনস্ট্রাক্টর কল) এ অনুমান করা যায় না, তাই ছাত্রলীগের লেখকরা একটি নন-জেনেরিক সহায়ক শ্রেণিকে কল করেছিলেন Tuple। অতএব আপনি বলতে পারেন Tuple.Create("Hello", 4)যা তুলনায় কিছুটা সহজ new Tuple<string, int>("Hello", 4)। (যাইহোক, .NET4.0 ইতিমধ্যে ২০১০ সাল থেকে এখানে রয়েছে))
জেপ্পে স্টিগ নীলসেন

4
মনে হয় আপনি Tuple<>কঠিন Equalsএবং GetHashCodeমান শব্দার্থক প্রয়োগ করে যা দুর্দান্ত। আপনার নিজস্ব টিপলগুলি প্রয়োগ করার সময় মনে রাখবেন।
নওফাল

এই স্পষ্টত কারণ সমান এবং GetHashCode ভেঙ্গে গেছে
julx

90

System.Web.UIPairশ্রেণিটি অন্তর্ভুক্ত কারণ এটি একটি অভ্যন্তরীণ ভিউস্টেট কাঠামো হিসাবে ASP.NET 1.1 এ ভারী ব্যবহৃত হয়েছিল।

অগাস্ট 2017 আপডেট করুন: সি # 7.0 /। নেট ফ্রেমওয়ার্ক 4.7 স্ট্রাকটি ব্যবহার করে নামযুক্ত আইটেমগুলির সাথে একটি টুপল ঘোষণা করার জন্য একটি বাক্য গঠন সরবরাহ করে System.ValueTuple

//explicit Item typing
(string Message, int SomeNumber) t = ("Hello", 4);
//or using implicit typing 
var t = (Message:"Hello", SomeNumber:4);

Console.WriteLine("{0} {1}", t.Message, t.SomeNumber);

দেখতে দুটিই MSDN আরো সিনট্যাক্স উদাহরণের জন্য।

জুন 2012 আপডেট করুন: Tuples সংস্করণ 4.0 এর সময় থেকে নেট নেট এর অংশ হয়ে উঠেছে।

এখানে NET4.0 অন্তর্ভুক্তির বর্ণনা এবং জেনেরিকদের জন্য সমর্থন:

Tuple<string, int> t = new Tuple<string, int>("Hello", 4);

2
লক্ষ্য করুন যে টিপলগুলি কেবল পঠনযোগ্য। এটি, আপনি এটি করতে পারবেন না:tuple.Item1 = 4;
স্কাইব্লাইকোডেফায়ার

2
টিপলস হ'ল আমি যা খুঁজছিলাম। ধন্যবাদ।
gligoran

38

দুর্ভাগ্যক্রমে, কিছুই নেই। আপনি System.Collections.Generic.KeyValuePair<K, V>অনেক পরিস্থিতিতে ব্যবহার করতে পারেন ।

বিকল্পভাবে, আপনি কমপক্ষে স্থানীয়ভাবে টিপলগুলি পরিচালনা করতে বেনামে প্রকারগুলি ব্যবহার করতে পারেন:

var x = new { First = "x", Second = 42 };

শেষ বিকল্পটি একটি নিজস্ব শ্রেণি তৈরি করা।


2
কেবল পরিষ্কার করার জন্য, বেনামে প্রকারভেদগুলি কেবল পঠনযোগ্য - এমএসডিএন
শে


11

কিছু উত্তর ঠিক ভুল বলে মনে হচ্ছে,

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

এখানে আমার জুটি ক্লাস

public class Pair<X, Y>
{
    private X _x;
    private Y _y;

    public Pair(X first, Y second)
    {
        _x = first;
        _y = second;
    }

    public X first { get { return _x; } }

    public Y second { get { return _y; } }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        Pair<X, Y> other = obj as Pair<X, Y>;
        if (other == null)
            return false;

        return
            (((first == null) && (other.first == null))
                || ((first != null) && first.Equals(other.first)))
              &&
            (((second == null) && (other.second == null))
                || ((second != null) && second.Equals(other.second)));
    }

    public override int GetHashCode()
    {
        int hashcode = 0;
        if (first != null)
            hashcode += first.GetHashCode();
        if (second != null)
            hashcode += second.GetHashCode();

        return hashcode;
    }
}

এখানে কিছু পরীক্ষার কোড দেওয়া হল:

[TestClass]
public class PairTest
{
    [TestMethod]
    public void pairTest()
    {
        string s = "abc";
        Pair<int, string> foo = new Pair<int, string>(10, s);
        Pair<int, string> bar = new Pair<int, string>(10, s);
        Pair<int, string> qux = new Pair<int, string>(20, s);
        Pair<int, int> aaa = new Pair<int, int>(10, 20);

        Assert.IsTrue(10 == foo.first);
        Assert.AreEqual(s, foo.second);
        Assert.AreEqual(foo, bar);
        Assert.IsTrue(foo.GetHashCode() == bar.GetHashCode());
        Assert.IsFalse(foo.Equals(qux));
        Assert.IsFalse(foo.Equals(null));
        Assert.IsFalse(foo.Equals(aaa));

        Pair<string, string> s1 = new Pair<string, string>("a", "b");
        Pair<string, string> s2 = new Pair<string, string>(null, "b");
        Pair<string, string> s3 = new Pair<string, string>("a", null);
        Pair<string, string> s4 = new Pair<string, string>(null, null);
        Assert.IsFalse(s1.Equals(s2));
        Assert.IsFalse(s1.Equals(s3));
        Assert.IsFalse(s1.Equals(s4));
        Assert.IsFalse(s2.Equals(s1));
        Assert.IsFalse(s3.Equals(s1));
        Assert.IsFalse(s2.Equals(s3));
        Assert.IsFalse(s4.Equals(s1));
        Assert.IsFalse(s1.Equals(s4));
    }
}

3
আপনি যদি আইকুয়েটেবল বাস্তবায়ন না করেন তবে আপনি বক্সিং পাবেন। আপনার ক্লাসটি সঠিকভাবে শেষ করতে আরও অনেক কাজ করা উচিত।
জ্যাক

8

যদি এটি অভিধান এবং এর মতো হয় তবে আপনি সন্ধান করছেন সিস্টেম.কলেশন.জেনারিক.কি.ভ্যালিউ পেয়ার <টি কে, টিভিয়াল>।


3

আপনি কী অর্জন করতে চান তার উপর নির্ভর করে আপনি কীভালিউয়ারটি চেষ্টা করে দেখতে পারেন

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



2

আমি এখনই একই প্রশ্ন জিজ্ঞাসা করছিলাম একটি দ্রুত গুগলের পরে আমি দেখতে পেলাম যে .NET- এ একটি জোড় শ্রেণি রয়েছে এটি সিস্টেমের বাইরে ছাড়াও e Web.UI ^ ~ ^ (http://msdn.microsoft.com/en-us/library/system.web.ui.pair.aspx ) ধার্মিকতা জানে তারা কেন সংগ্রহের কাঠামোর পরিবর্তে এটি সেখানে রেখেছিল?


আমি System.Web.UI.Pair সম্পর্কে জানি। যদিও জেনেরিক ক্লাস চাইছিল।
আলেকজান্ডার প্রোকোফিয়েভ

System.Web.UI. পেয়ারটি সিল করা হয়েছে। আপনি এটি থেকে উদ্ভূত করতে পারবেন না (যদি আপনি নিরাপদ প্রবেশাধিকারী টাইপ করতে চান)।
মার্টিন ভোবার

2

নেট 4.0 থেকে আপনার System.Tuple<T1, T2>ক্লাস রয়েছে:

// pair is implicitly typed local variable (method scope)
var pair = System.Tuple.Create("Current century", 21);

@ আলেকজান্দার, আপনি সহজেই টুপলে .NET 3.5 ডক্সে
সার্জ মিখাইলভ

নীচে তারা বলে: সংস্করণ তথ্য নেট ফ্রেমওয়ার্ক এতে সমর্থিত: 4
আলেকজান্ডার প্রোকোফিয়েভ

2
@ আলেকজান্ডার: ঠিক আছে, ঠিক আছে। (যদিও তারা আমাকে এই পৃষ্ঠাটি তৈরি করেছিল তা ভেবেই অবাক করে দিয়েছিল। নেট ৩.৫-নির্দিষ্ট)
সার্জ মিখাইলভ

2

আমি সাধারণত Tupleক্লাসটি আমার নিজের জেনেরিক মোড়কে নিম্নরূপে প্রসারিত করি

public class Statistic<T> : Tuple<string, T>
{
    public Statistic(string name, T value) : base(name, value) { }
    public string Name { get { return this.Item1; } }
    public T Value { get { return this.Item2; } }
}

এবং এটি এর মতো ব্যবহার করুন:

public class StatSummary{
      public Statistic<double> NetProfit { get; set; }
      public Statistic<int> NumberOfTrades { get; set; }

      public StatSummary(double totalNetProfit, int numberOfTrades)
      {
          this.TotalNetProfit = new Statistic<double>("Total Net Profit", totalNetProfit);
          this.NumberOfTrades = new Statistic<int>("Number of Trades", numberOfTrades);
      }
}

StatSummary summary = new StatSummary(750.50, 30);
Console.WriteLine("Name: " + summary.NetProfit.Name + "    Value: " + summary.NetProfit.Value);
Console.WriteLine("Name: " + summary.NumberOfTrades.Value + "    Value: " + summary.NumberOfTrades.Value);

1

উপরেরটি কাজ করার জন্য (অভিধানের কী হিসাবে আমার একটি জোড়া দরকার)। আমাকে যোগ করতে হয়েছিল:

    public override Boolean Equals(Object o)
    {
        Pair<T, U> that = o as Pair<T, U>;
        if (that == null)
            return false;
        else
            return this.First.Equals(that.First) && this.Second.Equals(that.Second);
    }

এবং একবার আমি এটি যোগ করেছিলাম

    public override Int32 GetHashCode()
    {
        return First.GetHashCode() ^ Second.GetHashCode();
    }

একটি সংকলক সতর্কতা দমন করতে।


1
এর চেয়ে আপনার আরও ভাল হ্যাশ-কোড অ্যালগরিদম পাওয়া উচিত, 37 + 23 * (এইচ 1 + 23 * (এইচ 2 + 23 * (এইচ 3 + ...)) ব্যবহার করে চেষ্টা করুন এটি (এ, বি) কে (বি, এ) থেকে আলাদা করবে ), অর্থাৎ। পুনঃনির্মাণের কোডে প্রভাব ফেলবে।
লাসে ভি কার্লসেন

মন্তব্যটি একটি স্বীকৃত .. আমার ক্ষেত্রে আমি কেবল কম্পাইলারটি নিখোঁজ করে দমন করার চেষ্টা করছিলাম, এবং যাইহোক টি একটি স্ট্রিং এবং ইউ একটি আন্ত 32 ...
অ্যান্ড্রু স্টেইন


1

কাস্টম ক্লাস বা। নেট 4.0 টিপলস ছাড়াও, সি # 7.0 যেহেতু ভ্যালুআপল নামে একটি নতুন বৈশিষ্ট্য রয়েছে, এটি এমন একটি কাঠামো যা এই ক্ষেত্রে ব্যবহার করা যেতে পারে। লেখার পরিবর্তে:

Tuple<string, int> t = new Tuple<string, int>("Hello", 4);

এবং এর মাধ্যমে মানগুলি অ্যাক্সেস করুন t.Item1এবং t.Item2আপনি কেবল এটির মতো এটি করতে পারেন:

(string message, int count) = ("Hello", 4);

অথবা এমনকি:

(var message, var count) = ("Hello", 4);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.