有没有办法使用LINQ执行以下操作?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Run Code Online (Sandbox Code Playgroud)
为了澄清,我想迭代集合中的每个对象,然后更新每个对象的属性.
我的用例是我在博客文章中有一堆评论,我想在博客文章中迭代每个评论,并将博客帖子上的日期时间设置为+10小时.我可以在SQL中完成它,但我想将它保留在业务层中.
受到另一个询问失踪问题的启发 Zip功能的:
为什么课堂上没有ForEach扩展方法Enumerable?还是在任 唯一获得ForEach方法的类是List<>.有没有理由错过(表演)?
是否有"For each"操作的Linq样式语法?
例如,将基于一个集合的值添加到另一个集合,已存在的集合:
IEnumerable<int> someValues = new List<int>() { 1, 2, 3 };
IList<int> list = new List<int>();
someValues.ForEach(x => list.Add(x + 1));
Run Code Online (Sandbox Code Playgroud)
代替
foreach(int value in someValues)
{
list.Add(value + 1);
}
Run Code Online (Sandbox Code Playgroud) 我最近开始使用LINQ并且令人惊叹.我想知道LINQ是否允许我将函数 - 任何函数 - 应用于集合的所有元素,而不使用foreach.像python lambda函数之类的东西.
例如,如果我有一个int列表,我可以使用LINQ为每个元素添加一个常量
如果我有一个数据库表,我可以使用LINQ为所有记录设置一个字段.
我正在使用C#
我在List集合中有一组整数值.我想为集合中的每个值调用一个函数,其中一个函数的参数是一个集合值.如果没有在foreach循环中执行此操作...有没有办法用lambda/linq表达式完成此操作?
像...这样的东西myList.Where(p => myFunc(p.Value));?
提前谢谢,-s
编辑
作为参考,这里是eric在评论中引用的博客文章
http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
弊
我想更多的好奇心,但C#规范Savants的一个...
为什么ForEach()子句在IQueryable/IEnumerable结果集上不起作用(或不可用)...
你必须首先转换你的结果ToList()或ToArray()大概是对C#迭代IEnumerables Vs的方式的技术限制.列表......是否与IEnumerables/IQuerable Collections的延迟执行有关.例如
var userAgentStrings = uasdc.UserAgentStrings
.Where<UserAgentString>(p => p.DeviceID == 0 &&
!p.UserAgentString1.Contains("msie"));
//WORKS
userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas));
//WORKS
Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas));
//Doesn't WORK
userAgentStrings.ForEach(uas => ProcessUserAgentString(uas));
Run Code Online (Sandbox Code Playgroud) 如果我有一个IEnumerable像:
string[] items = new string[] { "a", "b", "c", "d" };
Run Code Online (Sandbox Code Playgroud)
我想循环通过所有连续项目(大小为2的滑动窗口).这将是
("a","b"), ("b", "c"), ("c", "d")
Run Code Online (Sandbox Code Playgroud)
我的解决方案就是这样
public static IEnumerable<Pair<T, T>> Pairs(IEnumerable<T> enumerable) {
IEnumerator<T> e = enumerable.GetEnumerator(); e.MoveNext();
T current = e.Current;
while ( e.MoveNext() ) {
T next = e.Current;
yield return new Pair<T, T>(current, next);
current = next;
}
}
// used like this :
foreach (Pair<String,String> pair in IterTools<String>.Pairs(items)) {
System.Out.PrintLine("{0}, {1}", pair.First, pair.Second)
}
Run Code Online (Sandbox Code Playgroud)
当我编写这段代码时,我想知道.NET框架中是否已经存在执行相同操作的函数,并且它不仅适用于对,而且适用于任何大小的元组.恕我直言应该有一个很好的方法来做这种滑动窗口操作.
我使用C#2.0,我可以想象使用C#3.0(w/LINQ)有更多(更好)的方法来做到这一点,但我主要对C#2.0解决方案感兴趣.不过,我也很欣赏C#3.0解决方案.
我最近开始涉足Windows 8地铁,发现我的一个老朋友似乎已经失踪了.
我倾向于使用该.ForEach()方法而不是使用传统的foreach()构造,并且我很快意识到这种方法不可用.例如,此代码不会在metro应用程序下编译:
var list = new List<string>();
list.ForEach(System.Diagnostics.Debug.WriteLine);
Run Code Online (Sandbox Code Playgroud)
我已经搜索过,看看我是否能找到任何关于此的讨论,但是无法进行.我只是在钝,还是它真的消失了?
我使用了很多yield return关键字,但是当我想要添加一个范围时,我发现它缺乏IEnumerable.这是我想做的一个简单示例:
IEnumerable<string> SomeRecursiveMethod()
{
// some code
// ...
yield return SomeRecursiveMethod();
}
Run Code Online (Sandbox Code Playgroud)
当然这会导致错误,可以通过简单的循环来解决.有一个更好的方法吗?一个循环感觉有点笨重.
List<T>有一个调用的方法ForEach,它对每个元素执行传递的操作.
var names = new List<String>{ "Bruce", "Alfred", "Tim", "Richard" };
names.ForEach(p => { Console.WriteLine(p); });
Run Code Online (Sandbox Code Playgroud)
但是,如果names不是一个List<T>但是IList<T>,IList<T>没有像这样的方法ForEach.还有其他选择吗?