Пользовательское упорядочивание Linq

Подход ES6 очень чистый. Поэтому сначала вы инициализируете массив x длины, а затем вызываете для него метод fill.

let arr = new Array(3).fill(9)

это создаст массив с 3 элементами, такими как:

[9, 9, 9]
8
задан gunr2171 27 February 2015 в 19:26
поделиться

5 ответов

//Creating a dictionary with the custom order
var order = "MSHAP";
var orderDict = order.Select((c,i)=>new {Letter=c, Order=i})
                     .ToDictionary(o => o.Letter, o => o.Order);

var list = new List<string>{"A.ext", "H.ext", "M.ext", "P.ext", "S.ext"};

//Ordering by the custom criteria
var result = list.OrderBy(item => orderDict[item[0]]);

Вместо вызова orderDict [item [0]] у вас может быть хороший вспомогательный метод, который заботится о дополнительных случаях (несуществующие буквы, null и т. Д.). Но это идея.

14
ответ дан 5 December 2019 в 08:00
поделиться

Вы можете сохранить список желаемого порядка в массиве

int[] iIndex = {3,2,0,4, 1};

Скажем, str содержит ваш неупорядоченный список

List<string> str = new List<string>();
str.Add("Alison.ext");
str.Add("Heather.ext");
.
.
.

Добавьте свой список и соответствующий порядок в таблицу с данными

DataTable dt = new DataTable();
                dt.Columns.Add("Order", typeof(Int32));
                dt.Columns.Add("Name");

                for (int iCount =0; iCount< str.Count ; iCount ++)
                { 
                    DataRow drow1 = dt.NewRow();
                    drow1[0] = iIndex[iCount];
                    drow1[1] = str[iCount];
                    dt.Rows.Add(drow1);

                }
                dt.AcceptChanges();

Окончательно упорядочите свой список, чтобы получить yuor ожидаемый список

 var result = from ls in dt.AsEnumerable()
                         orderby ls.Field<int>("Order")
                         select ls;      
0
ответ дан 5 December 2019 в 08:00
поделиться

Here's a method that produces keys for ordering

public int OrderKey(string fileName)
{
  char first = fileName[0];
  int result =
     first  == 'M' ? 1 :
     first  == 'S' ? 2 :
     first  == 'H' ? 3 :
     first  == 'A' ? 4 :
     first  == 'P' ? 5 :
     6;
  return result;
}

Here's how to call it:

List<File> ordered = Files.OrderBy(f => OrderKey(f.FileName)).ToList();
6
ответ дан 5 December 2019 в 08:00
поделиться

Вы не упомянули, какие именно объекты у вас есть в списке, но предположим, что это некоторая общая структура, например так:

public class File {
  public string FileName { ... }
  public long FileSize { ... }
  /* elided */
}

Затем, учитывая IEnumerable с именем, скажем, файлов , вы можете просто сделать:

var result = files.OrderBy(f => f.FileName);
0
ответ дан 5 December 2019 в 08:00
поделиться
List<char> sortKeys = new List<char> { 'M', 'S', 'H', 'A', 'P' };
sortKeys.Reverse();
List<FileInfo> files = new List<FileInfo>(6);

foreach(char sortKey in sortKeys)
{
    var topFiles = files.Where(file => file.Name.StartsWith(sortKey.ToString()));
    var remainingFiles = files.Except(topFiles);
    files = topFiles.Concat(remainingFiles).ToList();
}

Непроверено, и я уверен, что есть более быстрые способы, но, по крайней мере, это с использованием linq, как вы просили: -)

редактировать: Я только что увидел правку в вашем сообщении, и теперь я понятия не имею, что вы действительно хотите сделать, поэтому мой код, вероятно, бесполезен для вас ..

1
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

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