Невозможно привязать к данным в mat-таблице

Я фактически реализовал его как метод расширения на StringComparer, чтобы вы могли сделать, например:

  • StringComparer.CurrentCulture.WithNaturalSort() или
  • StringComparer.OrdinalIgnoreCase.WithNaturalSort() .

Результирующий IComparer можно использовать во всех местах, таких как OrderBy, OrderByDescending, ThenBy, ThenByDescending, SortedSet и т. д. И вы все еще можете легко настраивать чувствительность к регистру, культуру и т. д.

Реализация довольно тривиальна и должна выполняться достаточно хорошо даже в больших последовательностях.


Я также опубликовал ее как tiny пакет NuGet , поэтому вы можете просто сделать:

Install-Package NaturalSort.Extension

Код, содержащий комментарии к документации XML и набор тестов тестов , доступен в репозиторий NaturalSort.Extension GitHub


Весь код это (если вы еще не можете использовать C # 7, просто установите пакет NuGet):

public static class StringComparerNaturalSortExtension
{
    public static IComparer WithNaturalSort(this StringComparer stringComparer) => new NaturalSortComparer(stringComparer);

    private class NaturalSortComparer : IComparer
    {
        public NaturalSortComparer(StringComparer stringComparer)
        {
            _stringComparer = stringComparer;
        }

        private readonly StringComparer _stringComparer;
        private static readonly Regex NumberSequenceRegex = new Regex(@"(\d+)", RegexOptions.Compiled | RegexOptions.CultureInvariant);
        private static string[] Tokenize(string s) => s == null ? new string[] { } : NumberSequenceRegex.Split(s);
        private static ulong ParseNumberOrZero(string s) => ulong.TryParse(s, NumberStyles.None, CultureInfo.InvariantCulture, out var result) ? result : 0;

        public int Compare(string s1, string s2)
        {
            var tokens1 = Tokenize(s1);
            var tokens2 = Tokenize(s2);

            var zipCompare = tokens1.Zip(tokens2, TokenCompare).FirstOrDefault(x => x != 0);
            if (zipCompare != 0)
                return zipCompare;

            var lengthCompare = tokens1.Length.CompareTo(tokens2.Length);
            return lengthCompare;
        }

        private int TokenCompare(string token1, string token2)
        {
            var number1 = ParseNumberOrZero(token1);
            var number2 = ParseNumberOrZero(token2);

            var numberCompare = number1.CompareTo(number2);
            if (numberCompare != 0)
                return numberCompare;

            var stringCompare = _stringComparer.Compare(token1, token2);
            return stringCompare;
        }
    }
}

2
задан Tachyon 19 March 2019 в 09:55
поделиться

1 ответ

Я заметил, что вам не нужно переносить MatTableDataSource<> для ответа API,

  async ngOnInit() {
    // Load the items from the blockchain
    this.items = await this.api.getApiRecords(); //this will be work
    //this.items = new MatTableDataSource<ApiRecord>(items); << remove this
  }

В этом примере stackblitz переменная dataSource содержит необработанные данные. Не нужно типа для MatTableDataSource<>

Обновление:

Здесь работает пример Stabblitz .

Ниже также обновляется код,

  <mat-header-row *matHeaderRowDef="['type', 'provider', 'url', 'country', 'updated_on']"></mat-header-row>
  <mat-row *matRowDef="let row; columns: ['type', 'provider', 'url', 'country', 'updated_on']">
  </mat-row>
0
ответ дан shadowman_93 19 March 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: