gpt4 book ai didi

c# - 我可以有条件地使用 LINQ 创建 IEnumerable 吗?

转载 作者:行者123 更新时间:2023-11-30 20:09:33 27 4
gpt4 key购买 nike

我必须遵循以下代码:

List<Obj> coll = new List<Obj>();

if (cond1) coll.Add(new Obj { /*...*/ });
if (cond2) coll.Add(new Obj { /*...*/ });
if (cond3) coll.Add(new Obj { /*...*/ });

有没有办法为此使用 LINQ 或集合初始化程序?

编辑:

我想在这里使用集合初始值设定项的原因是因为我有一个对象树,我完全使用初始值设定项和 LINQ 对其进行了初始化。这个点是唯一一个不遵循这个原则的点。

var myobj = new MyBigObj 
{
Prop1 = from .. select ..,
Prop2 = from .. select ..,
...
Prop3 = new MySmallerObj
{
PropSmall1 = from .. select ..,
PropSmall2 = from .. select ..,
...
}
};

现在这根本不适合我的方案:

List<Obj> coll = new List<Obj>();

if (cond1) coll.Add(new Obj { /*...*/ });
if (cond2) coll.Add(new Obj { /*...*/ });
if (cond3) coll.Add(new Obj { /*...*/ });

myobj.Prop4 = coll;

当然,我可以将这段代码放在一个单独的函数中,该函数返回 IEnumerable 并调用它.. :)

编辑 2:

看起来我必须编写一些我会调用的扩展方法:

new Obj[0]
.ConditionalConcat(cond1, x=>new Obj { /*...*/ })
.ConditionalConcat(cond2, x=>new Obj { /*...*/ })
.ConditionalConcat(cond3, x=>new Obj { /*...*/ })

最佳答案

一个相当糟糕的选择:

var conditions = new[] { cond1, cond2, cond3 };
var values = new[] { new Obj {...}, // First value
new Obj {...}, // Second value
new Obj { ...} // Third value
};

var list = conditions.Zip(values, (condition, value) => new { condition, value })
.Where(pair => pair.condition)
.Select(pair => pair.value)
.ToList();

虽然它并不比原始代码简单 ;)(而且它无条件地创建所有值 - 它只是有条件地将它们包含在集合中。)

编辑:一种仅在需要时构造值的替代方案:

var conditions = new[] { cond1, cond2, cond3 };
var valueProviders = new Func<Obj>[] {
() => new Obj {...}, // First value
() => new Obj {...}, // Second value
() => new Obj { ...} // Third value
};


var list = conditions.Zip(valueProviders,
(condition, provider) => new { condition, provider })
.Where(pair => pair.condition)
.Select(pair => pair.provider())
.ToList();

编辑:鉴于您请求的语法,这是一个相当简单的选项:

new List<Obj>()
.ConditionalConcat(cond1, x=>new Obj { /*...*/ })
.ConditionalConcat(cond2, x=>new Obj { /*...*/ })
.ConditionalConcat(cond3, x=>new Obj { /*...*/ })

使用扩展方法:

public static List<T> ConditionalConcat<T>(this List<T> source,
bool condition,
Func<T> provider)
{
if (condition)
{
source.Add(provider);
}
return source;
}

关于c# - 我可以有条件地使用 LINQ 创建 IEnumerable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6059299/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com