HRVP Ответов: 3

Как отсортировать список строк в порядке asc


У меня есть список моделей
публичный класс KitModel
{
публичная строка KitName { get; set; }
публичная строка KitCode { get; set; }
public decimal KitValue { get; set; }
}
List<kitmodel> listKitModel=новый список<kitmodel>();
имея такие данные, как это
listKitModel[0].KitCode ="BIN"
listKitModel[1].KitCode ="CAN9"
listKitModel[0].KitCode ="CAN8"
listKitModel[0].KitCode ="CAN10"
listKitModel[0].KitCode ="CAN11"
listKitModel[0].KitCode ="CAN12"

Что я уже пробовал:

я вроде как такой
listKitModel= listKitModel.OrderBy(x => x.KitCode).Список();

Я выхожу вот так
listKitModel[0].KitCode ="BIN"
listKitModel[0].KitCode ="CAN10"
listKitModel[0].KitCode ="CAN11"
listKitModel[0].KitCode ="CAN12"
listKitModel[1].KitCode ="CAN8"
listKitModel[0].KitCode ="CAN9"
Но ожидаемый результат-это asc
listKitModel[0].KitCode ="BIN"
listKitModel[0].KitCode ="CAN8"
listKitModel[1].KitCode ="CAN9"
listKitModel[0].KitCode ="CAN10"
listKitModel[0].KitCode ="CAN11"
listKitModel[0].KitCode ="CAN12"

Eric Lynch

Вам нужно будет уточнить свои правила для лучшего заказа. Что касается сравнения строк, то CAN10 предшествует CAN8 ("1" предшествует "8").

3 Ответов

Рейтинг:
1

George Swan

Мое предложение состояло бы в том, чтобы написать обычай ComparerКомпаратор может отделить как префикс слова, так и числовую суффиксальную часть KitCode. Тогда он мог бы использовать string.Compare для сравнения префиксов и использования CompareTo для сравнения числовых суффиксов.

class KitCodeComparer : IComparer<string>
   {
       public int Compare(string x, string y)
       {
           char[] digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
           int intpos = x.IndexOfAny(digits);
           string wordPrefixX = intpos == -1 ? x : x.Substring(0, intpos);
           int numericSuffixX = intpos == -1 ? intpos : int.Parse(x.Substring(intpos));
           intpos = y.IndexOfAny(digits);
           string wordPrefixY = intpos == -1 ? y : y.Substring(0, intpos);
           int numericSuffixY = intpos == -1 ? intpos : int.Parse(y.Substring(intpos));
           int result = string.Compare(wordPrefixX, wordPrefixY);
           if(result==0)
           {
               result = numericSuffixX.CompareTo(numericSuffixY);
           }
           return result;
       }

   }

Компаратор можно использовать так.

List<string> testStrings = new List<string>()
           {
               "BIN","CAN9","CAN8","CAN10","CAN11","CAN12"
           };
           testStrings.Sort(new KitCodeComparer());
           testStrings.ForEach(s => Console.WriteLine(s));


Рейтинг:
0

Gerry Schmitz

Func<string, string> mySort = ( s ) => {
   string alphas = s.PadRight( 3 ).Substring( 0, 3 );
   string digitChars = s.PadRight( 5, ' ' ).Substring( 3, 2 ).Trim();
   int digits = string.IsNullOrEmpty( digitChars ) ? 0 : int.Parse( digitChars );

   return $"{alphas}{digits:D2}";
};

var q = listKitModel.OrderBy( x => mySort( x.KitCode ) ).ToList();


Рейтинг:
0

adriancs

public class KitModel
{
    public string KitName { get; set; }
    public string KitCode { get; set; }
    public decimal KitValue { get; set; }

    public string KitCodePrefix { get; set; }
    public int KitIndex { get; set; }
}


List<KitModel> lst = new List<KitModel>();

lst.Add(new KitModel()
{
    KitCode = "BIN",
    KitCodePrefix = "BIN",
    KitIndex = 0
});
lst.Add(new KitModel()
{
    KitCode = "CAN8",
    KitCodePrefix = "CAN",
    KitIndex = 8
});
lst.Add(new KitModel()
{
    KitCode = "CAN9",
    KitCodePrefix = "CAN",
    KitIndex = 9
});
lst.Add(new KitModel()
{
    KitCode = "CAN12",
    KitCodePrefix = "CAN",
    KitIndex = 12
});

lst.Sort(delegate (KitModel x, KitModel y)
{
    int a = x.KitCodePrefix.CompareTo(y.KitCodePrefix);
    if (a == 0)
        a = x.KitIndex.CompareTo(y.KitIndex);
    return a;
});


Eric Lynch

Или сделайте класс IComparable<T> и список вызовов.Например, функция Sort() без параметра:

публичный класс KitModel : IComparable<KitModel>
{
публичная строка KitName { get; set; }
публичная строка KitCode { get; set; }
public decimal KitValue { get; set; }
публичная строка KitCodePrefix { get; set; }
public int KitIndex { get; set; }

public int CompareTo(KitModel other)
{
if (other == null)
возврат 1;

сравнение инт = KitCodePrefix.Метод compareto(другие.KitCodePrefix);
возвратное сравнение != 0 ? сравнение : KitIndex.CompareTo(другое.KitIndex);
}
}