ما هي أفضل طريقة لاستخدام زوج (الثلاثي ، الخ) من القيم قيمة واحدة في C# ؟

StackOverflow https://stackoverflow.com/questions/101825

سؤال

هذا هو أنني أود أن يكون tuple من القيم.

استخدام حالة في ذهني:

Dictionary<Pair<string, int>, object>

أو

Dictionary<Triple<string, int, int>, object>

هناك المدمج في أنواع مثل الزوج أو ثلاثة أضعاف ؟ أو ما هي أفضل طريقة لتنفيذ ذلك ؟

التحديث هناك بعض الأغراض العامة الصفوف تطبيقات وصفها في الإجابات ، ولكن الصفوف استخدام المفاتيح في القواميس يجب أن أديتيونالي التحقق من الحساب الصحيح من رمز التجزئة.بعض المعلومات عن ذلك في آخر السؤال.

تحديث 2 أعتقد أنه هو أيضا يستحق مذكرا أنه عند استخدام بعض قيمة المفتاح في القاموس ، ينبغي أن تكون ثابتة.

هل كانت مفيدة؟

المحلول

لقد نفذت tuple مكتبة في C#.زيارة http://www.adventuresinsoftware.com/generics/ وانقر على "الصفوف" وصلة.

نصائح أخرى

مدمج الطبقات

في بعض الحالات المحددة،.net framework يوفر بالفعل tuple-مثل الطبقات التي قد تكون قادرة على النفوذ.

أزواج و يتضاعف ثلاث مرات

عام النظام.مجموعات.Generic.Keyvaluepair العلامة فئة يمكن استخدامها بوصفها مخصصا زوج التنفيذ.هذه هي الطبقة التي عام القاموس يستخدم داخليا.

بدلا من ذلك, كنت قد تكون قادرة على جعل القيام مع النظام.مجموعات.DictionaryEntry هيكل بمثابة بدائية زوج و له ميزة كونها متوفرة في mscorlib.على الجانب السلبي, ومع ذلك, هو أن هذا الهيكل لا كتبته بقوة.

أزواج ثلاثية متاحة أيضا في شكل النظام.ويب.واجهة المستخدم.زوج و النظام.ويب.واجهة المستخدم.الثلاثي فصول.على الرغم من أطروحات فئات تعيش في النظام.ويب الجمعية أنها قد تكون مناسبة تماما winforms التنمية.إلا أن هذه الطبقات هي لا بقوة كتبته أما و قد لا يكون مناسبا في بعض الحالات ، مثل العام مقصود إطار أو مكتبة.

أعلى ترتيب الصفوف

للحصول على أعلى ترتيب الصفوف قصيرة من المتداول الخاصة بك الطبقة ، قد لا يكون حل بسيط.

إذا كنت قد قمت بتثبيت F# لغة, يمكنك أن مرجع FSharp.Core.dll الذي يحتوي على مجموعة من عامة ثابتة مايكروسوفت.Fsharp.الأساسية.Tuple دروس حتى عام sextuples.ومع ذلك ، على الرغم معدلة FSharp.Code.dll يمكن إعادة توزيعها ، و# بحوث اللغة و التقدم في العمل حتى هذا الحل من المرجح أن تكون ذات فائدة فقط في الأوساط الأكاديمية.

إذا كنت لا ترغب في إنشاء الخاصة بك فئة غير مريح الرجوع F# مكتبة, واحد أنيق خدعة يمكن أن تتكون في توسيع عامة keyvaluepair العلامة الدرجة حتى أن قيمة العضو هو نفسه المتداخلة keyvaluepair العلامة.

فعلى سبيل المثال ، يوضح التعليمة البرمجية التالية كيف يمكنك الاستفادة من Keyvaluepair العلامة من أجل خلق يتضاعف ثلاث مرات:

int id = 33;
string description = "This is a custom solution";
DateTime created = DateTime.Now;

KeyValuePair<int, KeyValuePair<string, DateTime>> triple =
   new KeyValuePair<int, KeyValuePair<string, DateTime>>();
triple.Key = id;
triple.Value.Key = description;
triple.Value.Value = created;

هذا يسمح بتمديد فئة إلى أي التعسفي المستوى كما هو مطلوب.

KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string> quadruple =
    new KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>();
KeyValuePair<KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>, string> quintuple =
    new KeyValuePair<KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>, string>();

لفة الخاص بك

في حالات أخرى قد تحتاج إلى اللجوء إلى المتداول الخاصة بك tuple الطبقة ، و هذا ليس من الصعب.

يمكنك إنشاء هياكل بسيطة مثل:

struct Pair<T, R>
{
    private T first_;
    private R second_;

    public T First
    {
        get { return first_; }
        set { first_ = value; }
    }

    public R Second
    {
        get { return second_; }
        set { second_ = value; }
    }
}

أطر و المكتبات

هذه المشكلة تم معالجتها من قبل والغرض العام الأطر لا وجود لها.وفيما يلي رابط واحد مثل هذا الإطار:

public struct Pair<T1, T2>
{
    public T1 First;
    public T2 Second;
}

public struct Triple<T1, T2, T3>
{
    public T1 First;
    public T2 Second;
    public T3 Third;
}

سريع إلى الأمام إلى 2010 .NET 4.0 يدعم الآن n-الصفوف التعسفي n.هذه المجموعات تنفيذ الهيكلية المساواة والمقارنة كما هو متوقع.

زوج الثلاثي الموجودة في الطبقات .صافي راجع msdn:

الثلاثي

زوج

كنت مؤخرا قد جاء عبر لهم ، في حين لعب حولها مع viewstate فك

عادة ما خلق بلدي البنية ، التي تحتوي على القيم.فإنه غالبا ما يكون قليلا أكثر قابلية للقراءة ;)

Keyvaluepair العلامة هو أفضل فئة لتمديد إذا كنت لا ترغب في إنشاء الفئات الخاصة بك.

int id = 33;
string description = "This is a custom solution";
DateTime created = DateTime.Now;

KeyValuePair<int, KeyValuePair<string, DateTime>> triple =
   new KeyValuePair<int, KeyValuePair<string, DateTime>>();
triple.Key = id;
triple.Value.Key = description;
triple.Value.Value = created;

أنت يمكن أن تمتد إلى العديد من المستويات كما تريد.

KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string, string> quadruple =
   new KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string, string>();

ملاحظة:الطبقات الثلاثي و زوج موجود داخل النظام.ويب-dll, حتى انها ليست مناسبة جدا عن حلول أخرى من ASP.NET.

يمكنك بسهولة نسبيا إنشاء الخاصة بك tuple الطبقات ، الشيء الوحيد الذي يحتمل أن يحصل فوضوي هو المساواة hashcode يتجاوز (ضروري إذا كنت تنوي استخدامها في القواميس).

وتجدر الإشارة إلى أن .صافي الخاصة KeyValuePair<TKey,TValue> البنية بطيئة نسبيا والمساواة hashcode.

على افتراض أن ليس مصدر قلق بالنسبة لك لا يزال هناك مشكلة رمز ينتهي من الصعب معرفة:

public Tuple<int, string, int> GetSomething() 
{
    //do stuff to get your multi-value return
}

//then call it:
var retVal = GetSomething();

//problem is what does this mean?
retVal.Item1 / retVal.Item3; 
//what are item 1 and 3?

في معظم هذه الحالات لا تجد أنه من الأسهل لإنشاء سجل معين فئة (على الأقل حتى C#4 يجعل هذا المترجم-السحر)

class CustomRetVal {
    int CurrentIndex { get; set; }
    string Message { get; set; }
    int CurrentTotal { get; set; }
}

var retVal = GetSomething();

//get % progress
retVal.CurrentIndex / retVal.CurrentTotal;

حل واحد بسيط ليس له ذكر حتى الآن.يمكنك أيضا استخدام List<T>.انها بنيت في وفعالة وسهلة الاستخدام.إنها تبدو غريبة بعض الشيء في البداية ، لكنه يؤدي وظيفته تماما ، وخاصة على أكبر عدد من العناصر.

NGenerics - شعبية .صافي الخوارزميات وهياكل البيانات المكتبة مؤخرا غير قابل للتغيير هياكل البيانات إلى مجموعة.

أول ثابتة منها لتنفيذ كانت زوج و tuple فصول.رمز جيدا مع تغطية الاختبارات و هي أنيقة جدا.يمكنك التحقق من ذلك هنا.فهي تعمل على الأخرى ثابتة البدائل في هذه اللحظة و يجب أن تكون جاهزة قريبا.

لا يوجد بنيت الإضافية ، ولكن زوج<T,R> فئة تافهة لخلق.

نعم هناك نظام.ويب.واجهة المستخدم.زوج و النظام.ويب.واجهة المستخدم.الثلاثي (الذي طاقتها الخالق الزوج-نوع السلوك!)

على الحالة الأولى ، وعادة ما تستخدم

Dictionary<KeyValuePair<string, int>, object>

ليس هناك المدمج في فصول هذا.يمكنك استخدام Keyvaluepair العلامة أو طرح تطبيق الخاصة بك.

هل يمكن استخدام النظام.مجموعات.Generic.Keyvaluepair العلامة الخاصة بك زوج التنفيذ.

أو هل يمكن أن مجرد تنفيذ الخاص بك ، فهي ليست صعبة:

public class Triple<T, U, V>
{
  public T First {get;set;}
  public U Second {get;set;}
  public V Third {get;set;}
}

بالطبع, كنت في يوم من الأيام قد واجهت مشكلة أن الثلاثي(string, int, int) غير متوافق مع الثلاثي(int, int, string).ربما تذهب مع النظام.Xml.Linq.XElement بدلا من ذلك.

هناك أيضا Tuple<> أنواع F#;تحتاج فقط إلى الإشارة FSharp.Core.dll.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top