将等于运算符转换为 Func for 参数,该<bool>扩展迭代 IEnumerable



我有一个扩展功能:

public static IEnumerable<B> iterate<T, B>(this IEnumerable<T> source, 
Func<bool> condition, B TAddT, B TAddF)
    {
        foreach(T a in source)
        {
            if (condition()) yield return TAddT;
            else yield return TAddF;
        }
    }

我有一些这样的代码:

List<bool> bar = new List<bool>(); //Supposed to be binary digits
//add some stuff to bar
string a = new string (bar.iterate<bool, char>(a == true, '1', '0')); //Convert a true to a 1, and a false to a 0

我将如何完成这项工作?我没有丝毫想法将a == true转换为Func<bool>

ie:如果您有一个包含:{true, true, false, false}List<bool> bar,并且您将运行迭代方法并将内容放入字符串中,则您会期望:"1100"

,在不编写扩展方法的情况下,这样做很简单。只需使用选择和三元运算符即可。

var foo = bar.Select( a => a ? '1': '0');

如果您坚持为此编写扩展方法,我想它看起来像这样:

static IEnumerable<char> Iterate(this IEnumerable<bool> source)
{
    return source.Select( a => a ? '1' : '0');
}

如果您想对类型和价值提高灵活性:

static IEnumerable<TOut> Iterate<TOut>(this IEnumerable<TIn> source, 
                                       Func<TIn, TOut> converter)
{
    return source.Select( a => converter(a));
}

并用

称呼它
var foo = bar.Iterate(a => a ? '1' : '0');

,如果我想准确地实现您的想法,那将是:

static IEnumerable<TOut> Iterate<TOut>(this IEnumerable<TIn> source, 
                                       Func<TIn, bool> decider,
                                       TOut resultIfTrue,
                                       TOut resultIfFalse)
{
    return source.Select( a => decider(a) ? resultIfTrue : resultIfFalse);
}

并用

称呼它
var foo = bar.Iterate<char>(a => a, '1', '0');

P.S。Iterate是LINQ扩展方法的可怕名称,将所有LINQ方法视为以某种方式迭代。

虽然功能本身有点时髦,但您可以使其适用于这样的任何条件:

IEnumerable<TOut> SelectLeftRight<TSource, TOut>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> selector, 
    TOut left, 
    TOut right) 
{
    return source.Select(input => selector(input) ? left : right);
}

用法:

bool[] source =  { true, false };
var left = '1';
var right = '0';
var str = new string(source.SelectLeftRight(a => a, left, right));

也可以与其他一些数据类型:

int[] source =  { 5, 3 };
var left = '1';
var right = '0';
var str = new string(source.SelectLeftRight(a => a > 4, left, right));

但是,正如您可以看到的那样,实现不如声明复杂,因此使用此方法可能不值得。

相关内容

最新更新