سؤال

كيف يمكنني فرز الكائنات في القائمة باسمهم؟ مثال:

mapPart_1_0
mapPart_1_2
mapPart_1_4
mapPart_1_6
mapPart_1_8
mapPart_1_10
mapPart_1_12
mapPart_1_24
mapPart_2_1
mapPart_2_11
Big list continues... (somewhere in that list are missing that aper in sorted one)

داخل:

mapPart_1_0
mapPart_1_1
mapPart_1_2
mapPart_1_3
mapPart_1_4
mapPart_1_5
...
mapPart_2_1
mapPart_2_2
mapPart_2_3
...
mapPart_2_11
...

أو هل يمكنني تغيير اسم الكائن إلى شيء آخر ، لذا سيكون من الأسهل أن تقصر؟

شكرًا لك.

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

المحلول

وهذا ينطوي على بعض الافتراضات الليبرالية حول متطلباتك ، وهو اختراق سريع ، ولكن ...

var groups = myList.Select (text => 
new
 { 
  FirstNum = int.Parse(text.Split('_')[1]), 
  SecondNum = int.Parse(text.Split('_')[2])
 })
.GroupBy(a => a.FirstNum, a => a.SecondNum);


foreach(var group in groups.OrderBy(g => g.Key))
{
  int min = group.Min();
  int max = group.Max();

  for(int i=min; i<=max; i++)
    yield return string.Format ("mapPart_{0}_{1}", group.key, i);

}

نصائح أخرى

قد ترغب في التفكير في النوع الطبيعي.

النوع العادي:

  • mappart_1_1
  • mappart_1_10
  • mappart_1_2

النوع الطبيعي:

  • mappart_1_1
  • mappart_1_2
  • mappart_1_10

يمكنك القراءة الفرز الطبيعي في C#.

أعتقد أنه يمكنك فعل شيء مثل هذا (لم يتم اختباره)

var yourList= new List<YourObject>();
//add items to your list

yourList.Sort(delegate(YourObject p1, YourObject p2)
              {
                  //you can make this delegate more complex if you need it
                  return p1.Name.CompareTo(p2.Name);
              });

تحقق] [1] هذا السؤال

ما تحتاجه هو وظيفة الفرز مع العرف icomparer. ما لديك الآن هو icomparer الافتراضي عند استخدام الفرز. هذا سوف تحقق من قيمة الحقل.

عندما تقوم بإنشاء icomparer مخصص (يمكنك القيام بذلك في فئةك من خلال تنفيذ icomparable واجهه المستخدم). ما تفعله هو: الكائن الخاص بك يتحقق من كل كائن آخر في القائمة التي تقوم بفرزها.

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

public class  ThisObjectCLass : IComparable{

    public int CompareTo(object obj) {
            ThisObjectCLass something = obj as ThisObjectCLass ;
            if (something!= null) 
                if(this.key.Split("_")[1].CompareTo(object.key.Split("_")[1]) == 0){
                // extratc the numbers from your name and compare the numbers, you have            to add some logic but I assume you know something about c#
                //then:
                   if .....
                }
                else if(this.key.Split("_")[1] "is more important then(use some logic here)" object.key.Split("_")[1]){
                 return 1
                }
                else return -1
            else
               throw new ArgumentException("I am a dumb little rabid, trying to compare different base classes");
        }
}

اقرأ الروابط أعلاه للحصول على معلومات أفضل.

يبدو أن هذا قد يكون ما تريده ، على افتراض أنك تريد أن يطيع الفرز كل رمز؟ لأكون صادقًا ، لست متأكدًا مما تريد أن تكون نتائجك ...

class Program
{
    public class ObjectNameComparer : IComparer<object>
    {
        public int Compare(object x, object y)
        {
            var n1 = x.ToString().Split('_');
            var n2 = y.ToString().Split('_');
            var nameCompare = string.Compare(n1[0], n2[0], StringComparison.OrdinalIgnoreCase);
            if (nameCompare == 0)
            {
                var i1 = int.Parse(n1[1]);
                var i2 = int.Parse(n2[1]);
                if (i1 == i2)
                {
                    var i12 = int.Parse(n1[2]);
                    var i22 = int.Parse(n2[2]);
                    return i12 - i22;
                }
                return i1 - i2;
            }
            return nameCompare;
        }
    }

    static void Main(string[] args)
    {
        var objectList = new List<object>();

        objectList.AddRange(new object[]
            {
                "mapPart_1_0",
                "mapPart_1_10",
                "mapPart_100_10",
                "mapPart_1_12",
                "mapPart_22_11",
                "mapPart_1_24",
                "mapPart_2_1",
                "mapPart_10_24",
                "mapPart_2_11",
            });

        var ordered = objectList.OrderBy(a => a, new ObjectNameComparer());

    }
}

حل سطر واحد أفضل لسلسلة!

//Sort by Name: list = List<string>() ...
list.Sort((x, y) => String.Compare(x, y, StringComparison.Ordinal));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top