基于某些属性对类对象进行分组和排序?

时间:2016-09-19 18:58:38

标签: c# performance linq

我的product类具有Description属性并且有3 product个对象:

Product product1 = new Product("This is bottom product");
Product product2 = new Product("This is top product");
Product product3 = new Product("This is medium product");

List<Product> lst = new List<Product>();
lst.Add(product1);
lst.Add(product2);
lst.Add(product3);

我想重新排列这些对象,以便所有products description top位于顶部,product description位于bottom来自底部。

var res = lst.Where(p => p.Desription == "This is top product")
                         .Concat(lst.Where(p => p.Desription == "This is medium product"))
                         .Concat(lst.Where(p => p.Desription == "This is bottom product")).ToList();

我编写了上面的查询来实现这一点。这会给我正确的结果。但我不确定这是解决这个问题的最有效方法吗?

有人可以建议任何替代/表现更好的方法吗?

注意:我在这里简化了问题。否则产品有更多的对象和属性。

4 个答案:

答案 0 :(得分:2)

编辑:

比comparer更好的解决方案(更快):

 public enum ProductType
    {
        Bottom=0,
        Medium,
        Top,
    }

    public class Product
    {
        public ProductType Type { get; set; }
        //the rest of properties here
    }

 var list = new List<Product>();
 var orderedList = list.OrderBy(x => (int)x.Type).ToList();

如果您不想在现有课程中添加任何内容,可以将其包装或扩展?

答案 1 :(得分:1)

在你的问题中给出了这个:

~nxa

我相信你要找的是这样的:

var res = lst.Where(p => p.Desription == "This is top product")
                         .Concat(lst.Where(p => p.Desription == "This is medium product"))
                         .Concat(lst.Where(p => p.Desription == "This is bottom product")).ToList();

我想指出“描述”的变量拼写错误。

答案 2 :(得分:0)

使用助手Dictionary

Dictionary<string, int> myDic = new Dictionary<string, int>
{
    {"top", 1},
    {"medium", 2},
    {"bottom", 3}
};
var res = lst.OrderBy(c => myDic[c.Desription.Split(' ')[2]]);

答案 3 :(得分:0)

尝试类似这样的内容,如果你知道每个描述只包含特定的措辞&#39; top&#39;,&#39; bottom&#39;,&#39; medium&#39;并且只有一个

List<Product> res = new List<Product>();
for (int i = 0; i < lst.Count(); i++)
{
    res.AddRange(lst.Where(p => p.Desription.Contains("top").ToList());
    res.AddRange(lst.Where(p => p.Desription.Contains("medium").ToList());
    res.AddRange(lst.Where(p => p.Desription.Contains("bottom").ToList());
}

我使用AddRange代替Add,因为可能有多个&#39; top&#39;,&#39; medium&#39;或者&#39;底部&#39;产品

如果说明中包含&#39; top&#39;那么它也不会起作用。和&#39;底部&#39;在同一个句子中,&#39; top&#39;和&#39; medium&#39;等