আমি আগ্রহী: std::pair
সি ++ এর সি # এর এনালগটি কী ? আমি System.Web.UI.Pair
ক্লাস পেয়েছি , তবে আমি টেম্পলেট ভিত্তিক কিছু পছন্দ করব prefer
ধন্যবাদ!
আমি আগ্রহী: std::pair
সি ++ এর সি # এর এনালগটি কী ? আমি System.Web.UI.Pair
ক্লাস পেয়েছি , তবে আমি টেম্পলেট ভিত্তিক কিছু পছন্দ করব prefer
ধন্যবাদ!
উত্তর:
টিপলগুলি .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
Tuple
। অতএব আপনি বলতে পারেন Tuple.Create("Hello", 4)
যা তুলনায় কিছুটা সহজ new Tuple<string, int>("Hello", 4)
। (যাইহোক, .NET4.0 ইতিমধ্যে ২০১০ সাল থেকে এখানে রয়েছে))
Tuple<>
কঠিন Equals
এবং GetHashCode
মান শব্দার্থক প্রয়োগ করে যা দুর্দান্ত। আপনার নিজস্ব টিপলগুলি প্রয়োগ করার সময় মনে রাখবেন।
System.Web.UI
Pair
শ্রেণিটি অন্তর্ভুক্ত কারণ এটি একটি অভ্যন্তরীণ ভিউস্টেট কাঠামো হিসাবে 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);
tuple.Item1 = 4;
দুর্ভাগ্যক্রমে, কিছুই নেই। আপনি System.Collections.Generic.KeyValuePair<K, V>
অনেক পরিস্থিতিতে ব্যবহার করতে পারেন ।
বিকল্পভাবে, আপনি কমপক্ষে স্থানীয়ভাবে টিপলগুলি পরিচালনা করতে বেনামে প্রকারগুলি ব্যবহার করতে পারেন:
var x = new { First = "x", Second = 42 };
শেষ বিকল্পটি একটি নিজস্ব শ্রেণি তৈরি করা।
কিছু উত্তর ঠিক ভুল বলে মনে হচ্ছে,
এখানে আমার জুটি ক্লাস
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));
}
}
যদি এটি অভিধান এবং এর মতো হয় তবে আপনি সন্ধান করছেন সিস্টেম.কলেশন.জেনারিক.কি.ভ্যালিউ পেয়ার <টি কে, টিভিয়াল>।
আপনি কী অর্জন করতে চান তার উপর নির্ভর করে আপনি কীভালিউয়ারটি চেষ্টা করে দেখতে পারেন ।
আপনি কোনও এন্ট্রির কীটি পরিবর্তন করতে পারবেন না এই বিষয়টি অবশ্যই কীভ্যালু পেয়ারের একটি নতুন উদাহরণ দ্বারা পুরো এন্ট্রিটি প্রতিস্থাপনের মাধ্যমে সংশোধন করা যেতে পারে।
আমি টিপলসের একটি সি # বাস্তবায়ন তৈরি করেছি, যা দুই থেকে পাঁচটি মানের মধ্যে সমস্যাটি সাধারণভাবে সমাধান করে - এখানে ব্লগ পোস্টটি উত্সের লিঙ্কে রয়েছে।
আমি এখনই একই প্রশ্ন জিজ্ঞাসা করছিলাম একটি দ্রুত গুগলের পরে আমি দেখতে পেলাম যে .NET- এ একটি জোড় শ্রেণি রয়েছে এটি সিস্টেমের বাইরে ছাড়াও e Web.UI ^ ~ ^ (http://msdn.microsoft.com/en-us/library/system.web.ui.pair.aspx ) ধার্মিকতা জানে তারা কেন সংগ্রহের কাঠামোর পরিবর্তে এটি সেখানে রেখেছিল?
নেট 4.0 থেকে আপনার System.Tuple<T1, T2>
ক্লাস রয়েছে:
// pair is implicitly typed local variable (method scope)
var pair = System.Tuple.Create("Current century", 21);
আমি সাধারণত 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);
উপরেরটি কাজ করার জন্য (অভিধানের কী হিসাবে আমার একটি জোড়া দরকার)। আমাকে যোগ করতে হয়েছিল:
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();
}
একটি সংকলক সতর্কতা দমন করতে।
পাওয়ার কালেকশন লাইব্রেরি (উইনটেলেক্ট থেকে পূর্বে উপলভ্য তবে এখন কোডপ্লেক্স @ http://powercollections.codeplex.com এ হোস্ট করা হয়েছে) এর জেনেরিক জোড় কাঠামো রয়েছে।
কাস্টম ক্লাস বা। নেট 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);