首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOrderedEnumerable与防御性编程

IOrderedEnumerable与防御性编程
EN

Stack Overflow用户
提问于 2009-11-24 18:20:44
回答 1查看 1.1K关注 0票数 2

我喜欢防御性编程。我讨厌扔破例,但这不是我的问题。

我调整了对linQ的扩展,以便能够使用列名执行订单。

代码语言:javascript
复制
        public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)

使用防御性编程,如果列名无效,此方法将返回给定的可枚举项。

现在,我需要用执行一个带有ThenBy的二级排序。所以我需要那个签名

代码语言:javascript
复制
        public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)

我需要返回一个IOrderedEnumerable。我的问题是保留我的防御性编程特性:我必须返回给定的集合--列名无效。

有干净的方法吗?我所想的只是一些小把戏:

  • 使用反射按第一个找到的属性排序,这是有风险的,因为该属性可能不是 my IOrderedEnumerable,这也有风险,因为我对IQueryable或IList执行排序,然后执行其他LinQ操作,因此我担心副作用。

和建议/建议?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-24 19:34:13

你可以下任何命令。如果列不存在,只需让您的输入像以前一样可枚举。为此,创建为所有元素返回相同值的键选择器。

见示例:

代码语言:javascript
复制
using System;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;

static class Program
{
    public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression) where T : class
    {
        Func<T, Int32> keySelector = (elem) =>
        {
            PropertyInfo pi = typeof(T).GetProperty(sortExpression, typeof(Int32));
            if (pi == null)
                return 0; // return the same key for all elements

            return Int32.Parse(pi.GetValue(elem, null).ToString());
        };

        return list.OrderBy(keySelector);
    }

    static void Main(string[] args)
    {
        // Create an array of strings to sort.
        string[] fruits = { "apricot", "orange", "banana", "mango", "apple", "grape", "strawberry" };

        // Sort by "column" Length
        foreach (string s in fruits.OrderBy<string>("Length"))
            Console.WriteLine(s);
        Console.WriteLine();

        // Sort by non-existing column
        foreach (string s in fruits.OrderBy<string>("ength"))
            Console.WriteLine(s);
        Console.ReadKey();
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1791950

复制
相关文章

相似问题

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