首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架中某些参数的排序

实体框架中某些参数的排序
EN

Stack Overflow用户
提问于 2016-05-02 00:38:17
回答 2查看 40关注 0票数 2

我有一个搜索结果表,其中的列包含有限的值,可以

代码语言:javascript
复制
"Completed", "Recruiting", "Active and not Recruiting" 

我希望"Recruiting“排在第一位,然后是"Active and not Recruiting”,最后是"Completed“。

我使用的表达式是这样的

代码语言:javascript
复制
List<Search> lst = new List<Search>(); 

var hello = db.tblSomething.Where(em=>em.someid==obj.someid).ToList

foreach(item in hello)
{
   SomeClass obj1 = new SomeClass();
   obj1.Status = hello.Status;   
   lst.Add(obj1);   
}

状态可以包含“已完成”、“招聘”、“活动”和“未招聘”中的任何一个。

招聘状态元素最先出现的表达式是什么?

EN

回答 2

Stack Overflow用户

发布于 2016-05-02 01:10:26

我希望"Recruiting“列排在第一位,然后是"Active and not Recruiting”,最后是"Completed“。

使用OrderBy

DotNetFiddle Example

代码语言:javascript
复制
    public static void Main()
{
    var list = new List<SomeClass>
    {
        new SomeClass{ Status = "Recruiting"},
        new SomeClass{ Status = "Completed"},
        new SomeClass{ Status = "Active and not Recruiting"},
        new SomeClass{ Status = "Completed"},
        new SomeClass{ Status = "Recruiting"}
    };
    
    PrintList(list);
    
    Console.WriteLine("-");
    
    var sorted = list
        .OrderBy(sc => sc.Status.Equals("Recruiting", StringComparison.OrdinalIgnoreCase)
            ? 0
            : sc.Status.Equals("Active and not Recruiting", StringComparison.OrdinalIgnoreCase)
                 ? 1
                 : sc.Status.Equals("Completed", StringComparison.OrdinalIgnoreCase)
                    ? 2
                    : 3)
        .ToList();
    
    
    PrintList(sorted);

}

public static void PrintList(IEnumerable<SomeClass> list)
{
    foreach(var sc in list) Console.WriteLine(sc.Status);
}

public class SomeClass
{
    public string Status { get; set; }  
}

结果:

回收

已完成

主动招聘和非招聘

已完成

再利用

-

再利用

再利用

主动招聘和非招聘

已完成

已完成

这一切都很好,但是非常丑陋并且非常脆弱的代码。相反,我强烈建议使用

DotNetFiddle Example

代码语言:javascript
复制
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
                    
public class Program
{
    public enum StatusType
    {
        [Display(Name = "Invalid", Order = -1)]
        Invalid = 0,
        [Display(Name = "Recuiting", Order = 0)]
        Recruiting,
        [Display(Name = "Completed", Order = 2)]
        Completed,
        [Display(Name = "Active and not Recruiting", Order = 1)]
        ActiveAndNotRecruiting
    }
    
    
    public static void Main()
    {
        var list = new List<SomeClass>
        {
            new SomeClass{ Status = StatusType.Recruiting, Id = 1, Name = "Abraham"},
            new SomeClass{ Status = StatusType.Completed, Id = 2, Name = "Ben"},
            new SomeClass{ Status = StatusType.ActiveAndNotRecruiting, Id = 3, Name = "Carl"},
            new SomeClass{ Status = StatusType.Completed, Id = 4, Name = "Dan"},
            new SomeClass{ Status = StatusType.Recruiting, Id = 5, Name = "Erin"}
        };
        
        PrintList(list);
        
        Console.WriteLine("-");
        
        var sorted = list
            .OrderBy(cs => cs.Status.ToDisplay().Order)
            .ToList();
        
        
        PrintList(sorted);

    }

    public static void PrintList(IEnumerable<SomeClass> list)
    {
        foreach(var sc in list) Console.WriteLine("{0}, {1} is {2}", sc.Id, sc.Name, sc.Status.ToDisplay().Name);
    }
    
    public class SomeClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public StatusType Status { get; set; }  
    }
}

public static class EnumExtensions
{
    public static DisplayAttribute ToDisplay(this Enum enumValue) 
    {
        return enumValue.GetType()
            .GetMember(enumValue.ToString())
            .First()
            .GetCustomAttributes(false)
            .Where(a => a is DisplayAttribute)
            .FirstOrDefault() as DisplayAttribute;
    }
}

结果:

1,亚伯拉罕正在休养

2、本已完成

3,卡尔是活跃的,不是招聘

4、丹完成了

5,Erin正在恢复

-

1,亚伯拉罕正在休整

5,Erin正在恢复

3,卡尔是活跃的,不是招聘

2、本已完成

4、丹完成了

使用Enum的优点是属性和排序的名称被封装到单个逻辑位置中。如果您想要更改顺序,可以在单个位置执行此操作,确保其他所有内容都会更改,并且不会破坏任何其他内容。这也消除了magic numbers/strings的使用。

票数 2
EN

Stack Overflow用户

发布于 2016-05-02 00:51:50

使用List<T>.Sort(Comparison<T>)方法。根据需要定义您对Search的比较。请参阅https://msdn.microsoft.com/en-us/library/w56d4y5z(v=vs.110).aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36969118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档