首页新闻找找看学习计划

LINQ order by 的问题,扩展比较规则。

0
[已解决问题] 解决于 2015-08-20 10:16

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 不识别方

Eysa的主页 Eysa | 初学一级 | 园豆:81
提问于:2015-08-04 11:44
< >
分享
最佳答案
0

用不着吧?你直接

(select new
{
Key = grp.Key,
}).OrderBy(d => d.Key==w?0:1)不就得了

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:28675 | 2015-08-04 12:10
其他回答(3)
0

可以自己实现一个Compare的方法吧?

顾晓北 | 园豆:9520 (大侠五级) | 2015-08-04 11:48

能否写个类,我看看。

支持(0) 反对(0) Eysa | 园豆:81 (初学一级) | 2015-08-04 11:49

是的,我已经把名字取好了,就叫 CategoryNameComparer,但是咋实现呢?

支持(0) 反对(0) Launcher | 园豆:44980 (高人七级) | 2015-08-04 11:50

@Eysa: http://www.cnblogs.com/Denny_Yang/archive/2011/05/23/2054070.html

支持(0) 反对(0) 顾晓北 | 园豆:9520 (大侠五级) | 2015-08-04 12:01

@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();

这样是可以的。。。

支持(0) 反对(0) 顾晓北 | 园豆:9520 (大侠五级) | 2015-08-04 14:50

@顾晓北:  多谢兄台。

支持(0) 反对(0) Eysa | 园豆:81 (初学一级) | 2015-08-04 14:53
0

这算哪门子orderby了?orderby就升序和降序.你这种情况,应该是遍历集合.把权重(排在集合前面的元素)加到一个新的集合.最后对这个集合按权重orderby,然后select就有你想要的结果

Cherbim | 园豆:318 (菜鸟二级) | 2015-08-04 11:52

 扩展一个Comparer接口不可以实现吗?

支持(0) 反对(0) Eysa | 园豆:81 (初学一级) | 2015-08-04 11:57
1
            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的字符串时排在前面。

gw2010 | 园豆:1337 (小虾三级) | 2015-08-04 15:21

   高人啊,牛B。

支持(1) 反对(0) Eysa | 园豆:81 (初学一级) | 2015-08-04 16:59

@Eysa: 不好意思,这里可能会有问题,注意 "0"这人地方,如果要安全可以写长一些。

如 v.StartsWith(w)?"00000000000"+v:v); 最好可以0的个数等于v最长的字符串长度,就安全了。

支持(0) 反对(0) gw2010 | 园豆:1337 (小虾三级) | 2015-08-05 17:45

@gw2010:  嗯嗯额,多谢提醒。

支持(0) 反对(0) Eysa | 园豆:81 (初学一级) | 2015-08-05 17:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册