2017-02-24 38 views
3
IQueryable<Employee> query = ((IEnumerable<Employee>)employeeList) 
    .Select(x => x) 
    .AsQueryable(); 

var strListEmployees = input.MustIncludeIdsInPage.Split(",").ToList(); 
//the list of employee is dynamic, it'd return 3, 4, 5 or more data 

var entities = query 
    .OrderBy(item => strListEmployees.IndexOf(item.Id.ToString())) 
    .PageBy(input) 
    .ToList(); 

example data如何使用固定的值进行排序LINQ和显示所有的休息与另一排序

我想是这样的顺序:员工姓名

D 
F 
A 
B 
C 
E 
G 
H 

员工d , F,顶部(修复List中的值),并使用名称排序(按顺序)显示其余部分。

+1

所以要预先选择一些实体从名单让他们的顺序和该选择添加其他。其他人将排序列表从没有开始的列表中排序。 – Tatranskymedved

+0

是啊,这样的事情,但我可以只使用一个LINQ呢? @Tatranskymedved –

回答

1

您可以使用OrderBy()ThenBy()

List<Test> tests = new List<Test>() 
      { 
       new Test() {EmployeeID = "1", Name = "A"}, 
       new Test() {EmployeeID = "2", Name = "B"}, 
       new Test() {EmployeeID = "3", Name = "C"}, 
       new Test() {EmployeeID = "4", Name = "D"}, 
       new Test() {EmployeeID = "5", Name = "E"}, 
       new Test() {EmployeeID = "6", Name = "F"}, 
       new Test() {EmployeeID = "7", Name = "G"}, 
       new Test() {EmployeeID = "8", Name = "H"}, 
      }; 

var x = tests.OrderBy(name => name.Name != "D") 
      .ThenBy(name => name.Name != "F") 
      .ThenBy(name => name.Name != "A") 
      .ThenBy(name => name.Name) 
      .ToList(); 

结果是:一是d,F,A等人的名字

enter image description here

编辑:

string[] filtr = new[] {"D", "F", "A"}; 
var fdata = tests.Where(d => filtr.Contains(d.Name)).OrderBy(z=>z.Name).ToList(); 
var odata = tests.Where(d => !filtr.Contains(d.Name)).OrderBy(z => z.Name).ToList(); 
fdata.AddRange(odata); 
+0

感谢您的回答,我忘了告诉它我需要的是IDS的动态列表,它会是3个数据以上。 –

+0

@RobinJunior编辑给你所需要的东西。 –

1

由于M. Wiśnicki提到,这是很容易解决的你只有3个元素。但是,动态地解决这个问题,我会坚持一些功能,在这里你将进入您要对其进行过滤的对象,也是Names,基于的List(或IEnumerable)。

下面的代码是recursion,它将通过数组并选择第一个元素(从数组)并添加其余的。剩下的就是调用没有第一名称&相同功能,无需我们已经添加的元素。

喜欢的东西:

public IEnumerable<Employee> GetOrderedPrefered(IEnumerable<Employee> aList, string[] aNames) 
{ 
    if (aNames.Length == 0) return aList.OrderBy(a => a.Name).ToList(); 

    var lRes = new List<Employee>() 
    { 
     aList.FirstOrDefault(a => a.Name == aNames[0]) 
    }; 

    lRes.AddRange(
     GetOrderedPrefered(
      aList.Where(a => a.Name != aNames[0]), 
      aNames.Where(a => a != aNames.First() 
     ).ToArray() 
    )); 

    return lRes; 
} 

用法:

var lRes = GetOrderedPrefered(persons, names); 
foreach (var item in lRes) 
    Console.WriteLine(item.Name); 

> D 
> F 
> A 
> B 
> C 
> E 
> G 
+0

什么是反对票? – Tatranskymedved

0
var set = Enumerable.Range(0, 8) 
        .Select(i => new { 
         Name = new string(new[] { (char)('A' + i) }) 
        }); 

var before = string.Join(",", set.Select(i => i.Name)); //A,B,C,D,E,F,G,H 


var priorities = "D,F".Split(',').Select((v, i) => new { Value = v, Index = i }); 

var query = from s in set 
      join p in priorities on s.Name equals p.Value into m 
      from x in m.DefaultIfEmpty(new { Value = s.Name, Index = int.MaxValue }) 
      orderby x.Index, s.Name 
      select s.Name; 

var result = string.Join(",", query); //D,F,A,B,C,E,G,H