使用lambda更新对象的值

Inx*_*Inx 2 c# ienumerable lambda

我有这个IEnumerable类型的问题..类Question有属性,Question(字符串)和Id(int)

我想要做的是,如果IEnumerable中的任何对象的问题长度> 25,那么"子串"它并添加"..."

所以我的想法是这样的:

ienumQuestions.Where(e=>e.Question.Length > 25).Change(e.Question=>e.Question.Substring(25)+"...");
Run Code Online (Sandbox Code Playgroud)

现在我不确定该语法是否100%正确但我希望你明白这一点..

是否有wanyway这样做?..我真的不想为此创建一个循环..因为我根本不喜欢循环:)

提前致谢!

Ric*_*ard 10

谨慎行事

您可以ForEach在LINQ中使用着名的扩展方法来迭代每个项目并相应地对其进行操作.基本上它与Change你描述的方法相同,可能看起来像这样:

ForEach LINQ扩展方法

public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
{
    foreach(TSource item in source)
    {
        action(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

履行

ienumQuestions.Where(e => e.Question.Length > 25).ForEach(e =>
{
    e.Question = e.Question.Substring(0, 25) + "...";
});

// or
ienumQuestions.ForEach(e =>
{
    if (e.Question.Length > 25)
    {
        e.Question = e.Question.Substring(0, 25) + "...";
    }
});
Run Code Online (Sandbox Code Playgroud)

论证和额外阅读

我个人不喜欢使用ForEachLINQ扩展来直接更新对象的方法,我更喜欢将它用于参考目的.我强烈建议在采用它之前阅读"foreach vs ForEach",因为它本质上违背了LINQ的主体,因为它直接修改了集合中的对象,这正是LINQ原本打算做的.