আমি আগ্রহী: 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.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);
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);