我的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();
我编写了上面的查询来实现这一点。这会给我正确的结果。但我不确定这是解决这个问题的最有效方法吗?
有人可以建议任何替代/表现更好的方法吗?
注意:我在这里简化了问题。否则产品有更多的对象和属性。
答案 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;等