Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .
Цитата из поста:
Perl:
find . -type f -print |
perl -l -ne '
Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .
Цитата из поста:
Perl:
[110] Python:
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{ Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .
Цитата из поста:
Perl:
[110] Python:
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
} = -M; # store file age (mtime - now)
END {
$,="\n";
print sort { Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .
Цитата из поста:
Perl:
[110] Python:
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{$b} <=> Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .
Цитата из поста:
Perl:
[110] Python:
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{$a}} keys %_; # print by decreasing age
}'
Python:
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
Это определенно не идеально с точки зрения производительности - вы в конечном итоге создаете множество итераторов для больших деревьев вместо одного итератора, который знает, как эффективно обходить.
Некоторые записи в блогах, касающиеся это:
Стоит отметить что F # имеет эквивалент предложенного « yield foreach
» с « yield!
»
Вы можете повысить производительность, если развернете рекурсию в стек, поэтому у вас будет только один итератор:
public IEnumerable<Foo> GetAll()
{
Stack<Foo> FooStack = new Stack<Foo>();
FooStack.Push(this);
while (FooStack.Count > 0)
{
Foo Result = FooStack.Pop();
yield return Result;
foreach (Foo NextFoo in Result.MyChildren)
FooStack.Push(NextFoo);
}
}
Согласно моему предыдущему опыту, использование yield намного эффективнее, чем создание списка. Если вы используете .NET 3.5, эта реализация должна подойти. Но не забывайте
yield break;
в конце. : -)
Нет, выглядит нормально.
Взгляните на мою запись в блоге , она может быть полезна :)
A better solution might be to create a visit method that recursively traverses the tree, and use that to collect items up.
Something like this (assuming a binary tree):
public class Node<T>
{
public void Visit(Action<T> action)
{
action(this);
left.Visit(action);
right.Visit(action);
}
public IEnumerable<Foo> GetAll ()
{
var result = new List<T>();
Visit( n => result.Add(n));
return result;
}
}
Taking this approach