سؤال

ولدي الحاجة إلى زوج قيمة الرئيسي الذي أود أن فرز لذلك قررت أن استخدام SortedList بدلا من جدول هاش.

وأنا وأضاف البيانات في النظام أدناه لبلدي SortedList وهو أمر أنا في حاجة إليها في

     Key          | Value
     --------------------------------
 1   "700-800"    | List(Of Object)
 2   "900-1000"   | List(Of Object)
 3   "1100-1200"  | List(Of Object)
 4   "1700-1800"  | List(Of Object)
 5   "1900-2000"  | List(Of Object)

والمفتاح هو سلسلة والقيمة هي قائمة الكائنات. المفتاح هو يمثل فتحة الوقت الذي تم متصلا من قيمتين عدد صحيح ومحدد من قبل "-". "700" كما كانت سلسلة 0700 في البداية صحيح.

ومنها مثلا.

Dim key As String = slotTimeStart.ToString() & "-" & slotTimeEnd.ToString()

ولكن مرة واحدة وتضاف هذه أزواج قيمة المفتاح إلى SortedList تظهر في النظام

 3   "1100-1200"  | List(Of Object)
 4   "1700-1800"  | List(Of Object)
 5   "1900-2000"  | List(Of Object)
 1   "700-800"    | List(Of Object)
 2   "900-1000"   | List(Of Object)

للأسف تلقي مرات فتحات كما قيمتين صحيحا والتي لا يمكن تغييرها.

هل هناك أي وسيلة لفرض نوع على SortedList؟ أم أن هذه المشكلة بسبب الطريقة أنا تخزين المفتاح الخاص بي؟ هل هناك طريقة أفضل لتخزينه؟

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

المحلول

SortedList(Of String, List(Of Object)) لكن تمر في <أ href = ل "http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx" يختلط = "نوفولو noreferrer"> IComparer(Of String) لفي منشئ ، حيث تنفيذ سيقارن مفاتيح وفقا لطلب تريد.

وسيكون لديك لتنفيذ ذلك بنفسك، ولكن لا ينبغي أن يكون من الصعب جدا - تقسيم مجرد سلسلة من '-'، تحليل كلا الجانبين مع Int32.Parse والرد وفقا لذلك. يمكنك حتى لا داعي للقلق بشأن الجزء بعد '-'، إذا نطاقات الرئيسية الخاصة بك هي غير متداخلة

وتحرير: وفيما يلي عرض. فإنه يطبع فقط من المفاتيح، ولكن هذا يكفي لاظهار انهم مرتبة كما تريد.

using System;
using System.Collections.Generic;

public class Test
{
    static void Main(string[] args)
    {
        var list = new SortedList<string, int>(new RangeComparer());
        list.Add("900-1000", 10);
        list.Add("1100-1200", 20);
        list.Add("700-800", 30);
        list.Add("1700-18000", 40);
        list.Add("1900-2000", 50);

        foreach (var entry in list)
        {
            Console.WriteLine(entry.Key);
        }
    }
}

public class RangeComparer : IComparer<string>
{
    private static int ParseStartOfRange(string range)
    {
        int hyphenIndex = range.IndexOf('-');
        // Normally do some error checking in case hyphenIndex==-1
        string firstPart = range.Substring(0, hyphenIndex);
        return int.Parse(firstPart);
    }

    public int Compare(string first, string second)
    {
        // In real code you would probably add nullity checks
        int firstStart = ParseStartOfRange(first);
        int secondStart = ParseStartOfRange(second);
        return firstStart.CompareTo(secondStart);
    }
}

نصائح أخرى

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

وتايمز أن أقل من 4 أرقام حاجة طويلة إلى أن يبدأ مع صفر ( "0") لجعلها نفس طول تلك مع 4 أرقام. وبهذه الطريقة، فإن المقارن قياسي مقارنة شار 1 من سلسلة (1) الذي سيكون الآن 0 إلى شار 1 من سلسلة (2) الذي سيكون 1، وسوف سلسلة 1 يخرج أولا.

ويمكن أن تكون مفاتيح عشرية وتبدو وكأنها

7.08
9.1
11.12
17.18
19.20

ووتحويل وتنسيق لسلسلة حسب الحاجة.

    Dim sl As New SortedList(Of Decimal, Object)
    'sample data
    For x As Integer = 7 To 20 Step 2
        sl.Add(CDec(x + ((x + 1) / 100)), New Object)
    Next

    Dim aKey As Decimal
    Dim slotStart As DateTime = #1:00:00 PM#
    Dim slotEnd As DateTime = #2:00:00 PM#

    aKey = CDec(slotStart.Hour + (slotEnd.Hour / 100))
    sl.Item(aKey) = New Object
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top