You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何便捷地将IEnumerable转换为TheoryData?

实现IEnumerable到TheoryData的便捷转换

可以通过自定义LINQ扩展方法实现流畅的转换,完美契合链式调用风格,同时保留TheoryData的编译时类型检查优势。

单参数场景的扩展方法

先针对单参数的TheoryData<T>编写基础扩展:

public static class TheoryDataExtensions
{
    public static TheoryData<TResult> ToTheoryData<TSource, TResult>(
        this IEnumerable<TSource> source,
        Func<TSource, TResult> selector)
    {
        var theoryData = new TheoryData<TResult>();
        foreach (var item in source)
        {
            theoryData.Add(selector(item));
        }
        return theoryData;
    }

    // 简化版:无需转换时直接复用元素本身
    public static TheoryData<T> ToTheoryData<T>(this IEnumerable<T> source)
    {
        return source.ToTheoryData(x => x);
    }
}

枚举场景的实际用法

现在就能像你期望的那样链式调用了:

// 和你示例一致的带转换逻辑写法
var dbEnumOptions = Enum.GetValues(typeof(MyEnum))
    .Cast<MyEnum>()
    .ToTheoryData(v => v);

// 直接复用枚举元素的简化写法
var dbEnumOptions = Enum.GetValues(typeof(MyEnum))
    .Cast<MyEnum>()
    .ToTheoryData();

多参数场景扩展(可选)

如果需要支持多参数的TheoryData<T1, T2>等,可以继续重载扩展方法:

public static TheoryData<T1, T2> ToTheoryData<TSource, T1, T2>(
    this IEnumerable<TSource> source,
    Func<TSource, T1> selector1,
    Func<TSource, T2> selector2)
{
    var theoryData = new TheoryData<T1, T2>();
    foreach (var item in source)
    {
        theoryData.Add(selector1(item), selector2(item));
    }
    return theoryData;
}

核心优势

  • 完全延续LINQ的流畅编程风格,无需打断链式操作
  • 依托TheoryData的编译时类型检查,避免MemberData常见的运行时类型不匹配问题
  • 扩展方法通用,适用于任何IEnumerable数据源,不局限于枚举

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:24:08