我有这个IEnumerable类型的问题..类Question有属性,Question(字符串)和Id(int)
我想要做的是IEnumerable中任何对象的问题是否具有长度> 25 然后“子串”它并添加“...”
所以我的想法是这样的:
ienumQuestions.Where(e=>e.Question.Length > 25).Change(e.Question=>e.Question.Substring(25)+"...");
现在我不确定该语法是否100%正确,但我希望你明白这一点......
有没有做到这一点?...我真的不想为此创建一个循环..因为我根本不喜欢循环:)
提前致谢!
答案 0 :(得分:10)
您可以在LINQ中使用着名的ForEach
扩展方法来迭代每个项目并相应地对其进行操作。基本上它与您描述的Change
方法相同,可能看起来像这样:
ForEach
LINQ扩展方法public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
{
foreach(TSource item in source)
{
action(item);
}
}
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) + "...";
}
});
我个人不喜欢使用ForEach
LINQ扩展来直接更新对象的方法,我更喜欢将它用于参考目的。我强烈建议在采用之前阅读"foreach vs ForEach",因为它本质上违反了LINQ的主体,因为它直接修改了集合中的对象,这正是LINQ原本打算做的。
答案 1 :(得分:0)
LINQ中没有Change
扩展名,IEnumerable
和String
都是不可变的(级别略有不同),因此无法更改。
我想你想要一个像这样的截断扩展,
IEnumerable<string> Truncate<T>(
this IEnumerable<T> source,
Func<T, string> stringAccessor,
int length,
string suffix)
{
var strings = source.Select(stringAccesor);
return strings.Select(s =>
{
if (s.Length < length)
{
return s;
}
return string.Format(
"{0}{1}",
s.SubString(0, length),
suffix)
});
}
你可以像这样打电话
var truncatedQuestions = ienumQuestions.Truncate(q => q.Question, 25, "...");