小编Jus*_*gan的帖子

为什么不支持C#静态类扩展方法?

我从这个问题中知道,扩展方法只能在类实例上运行,而不能在静态类本身上运行.这意味着我无法扩展有用的静态类,如ConvertMath.

我想知道的是,为什么会这样?从上面的链接,有一些关于C#团队如何实现这种功能的建议.是否有一些哲学上的理由不支持它?

例如,这里有一个理由,为什么没有内置的LINQ ForEach<T>扩展IEnumerable<T>.

c# linq language-design

56
推荐指数
2
解决办法
9332
查看次数

C#lambda表达式和IComparer

我使用lambda表达式来排序和搜索C#中的数组.我不想在我的类中实现IComparer接口,因为我需要对多个成员字段进行排序和搜索.

class Widget
{
    public int foo;

    public void Bar()
    {
        Widget[] widgets;

        Array.Sort(widgets, (a, b) => a.foo.CompareTo(b.foo));

        Widget x = new Widget();
        x.foo = 5;
        int index = Array.BinarySearch(widgets, x,
                                       (a, b) => a.foo.CompareTo(b.foo));
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然排序工作正常,但二进制搜索会产生编译错误无法将lambda表达式转换为类型'System.Collections.IComparer <Widget>',因为它不是委托类型.由于某种原因,Sort对IComparer和Comparison都有重载,但BinarySearch只支持IComparer.经过一些研究,我发现ComparisonComparer<T>将比较转换为IComparer 的笨重:

public class ComparisonComparer<T> : IComparer<T>
{
    private readonly Comparison<T> comparison;

    public ComparisonComparer(Comparison<T> comparison)
    {
        this.comparison = comparison;
    }

    int IComparer<T>.Compare(T x, T y)
    {
        return comparison(x, y);
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许二进制搜索如下工作:

int index = Array.BinarySearch(
  widgets,
  x, …
Run Code Online (Sandbox Code Playgroud)

c# lambda binary-search icomparer

17
推荐指数
2
解决办法
2万
查看次数

标签 统计

c# ×2

binary-search ×1

icomparer ×1

lambda ×1

language-design ×1

linq ×1