string w = "abc";
(select new
{
Key = grp.Key,
}).OrderBy(d => d.Key, new CategoryNameComparer(w))
排序规则是,集合里的Key如果有完全等于w的则放在最前面,否则其他随便排,默认便可。
public class CategoryNameComparer : IComparer<string>
{
private string w;
//public CategoryNameComparer(string )
//{
// this.w = w;
//}
public int Compare(string x, string y)
{
return 1;
}
}
这是我自己实现的方法,可是报错,说是
LINQ to Entities 不识别方
用不着吧?你直接
(select new
{
Key = grp.Key,
}).OrderBy(d => d.Key==w?0:1)不就得了
可以自己实现一个Compare的方法吧?
能否写个类,我看看。
是的,我已经把名字取好了,就叫 CategoryNameComparer,但是咋实现呢?
@Eysa: http://www.cnblogs.com/Denny_Yang/archive/2011/05/23/2054070.html
@Eysa:
string str = "abc"; List<string> list = new List<string>(); list.Add("123"); list.Add("234"); list.Add("345"); list.Add("abc234324"); list.Sort(delegate(string a, string b) { if (a.Contains(str) && b.Contains(str)) { return 0; } else { if (a.Contains(str)) { return -1; } if (b.Contains(str)) { return 1; } else { return 0; } } }); foreach (var item in list) { Console.WriteLine(item); } Console.ReadLine();
这样是可以的。。。
@顾晓北: 多谢兄台。
这算哪门子orderby了?orderby就升序和降序.你这种情况,应该是遍历集合.把权重(排在集合前面的元素)加到一个新的集合.最后对这个集合按权重orderby,然后select就有你想要的结果
扩展一个Comparer接口不可以实现吗?
string w = "w"; List<string> list = new List<string>(); list.Add("w123"); list.Add("w234"); list.Add("345"); list.Add("abc234324"); list.Add("w123"); list.Add("w234"); var q=list.OrderBy(v => v.StartsWith(w) ? "0" + v : v); foreach (var item in q) { Console.WriteLine(item); } Console.Read();
同sql一样,用一个取巧的办法处理,当出现w的字符串时排在前面。
高人啊,牛B。
@Eysa: 不好意思,这里可能会有问题,注意 "0"这人地方,如果要安全可以写长一些。
如 v.StartsWith(w)?"00000000000"+v:v); 最好可以0的个数等于v最长的字符串长度,就安全了。
@gw2010: 嗯嗯额,多谢提醒。