这个问题提到了这个Enumerator::Yielder#yield
方法.我之前没有使用它,我想知道在什么情况下它会有用.
当您想要创建无限的项目列表(例如Eratosthenes的Sieve)以及何时需要使用外部迭代器时,它是否主要有用?
有一组List<int>
包含一些数字.随机选择一个索引,将单独处理(称之为主索引).现在,我想要排除这个特定的索引,并获取所有其他元素List
(称为slave).
var items = new List<int> { 55, 66, 77, 88, 99 };
int MasterIndex = new Random().Next(0, items .Count);
var master = items.Skip(MasterIndex).First();
// How to get the other items into another List<int> now?
/* -- items.Join;
-- items.Select;
-- items.Except */
Run Code Online (Sandbox Code Playgroud)
Join
,Select
,Except
-任何人,怎么样?
编辑:无法删除原始列表中的任何项目,否则我必须保留两个列表.
我在Python中有一个对象列表,每个对象都有一个id
属性.我想获得这些ID的列表.
在C#我会写
myObjects.Select(obj => obj.id);
Run Code Online (Sandbox Code Playgroud)
我将如何在Python中执行此操作?
实体框架5+应该预先编译所有查询.但是,对于诸如此类的查询
List<Guid> ids;
var entities = context.MyEntities.Where(x => ids.Contains(x.Id)).ToArray();
Run Code Online (Sandbox Code Playgroud)
实体框架无法预编译查询,并且根据整体查询的复杂性,将表达式树解析为SQL可能会消耗几秒钟.有没有人找到一个解决方法来获得预编译的查询?我真的不明白为什么会这么难; 当然很难用参数,因为元素的数量可以不同,但是像SQL那样就足够了
SELECT a, b, c from MyEntities
WHERE c in __PLACEHOLDER__
Run Code Online (Sandbox Code Playgroud)
然后用实际的列表元素替换占位符.当然,它不如传递参数那么好,但它要比等待几秒钟一遍又一遍地解析整个表达式树要好得多.
我有一个Employee
定义如下的类:
Employee
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime WorkDate { get; set; }
public bool isOff { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的类实现和用法:
List<Employee> workers = new List<Employee>()
{
new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/11/2016"), IsOff = false},
new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/12/2016"), IsOff = false},
new Employee { Id = 1, Name …
Run Code Online (Sandbox Code Playgroud) 假设我有一系列数字,例如
ary = [1, 3, 6, 7, 10, 9, 11, 13, 7, 24]
Run Code Online (Sandbox Code Playgroud)
我想在第一个点之间拆分数组,其中较小的数字跟随较大的数字.我的输出应该是:
[[1, 3, 6, 7, 10], [9, 11, 13, 7, 24]]
Run Code Online (Sandbox Code Playgroud)
我试过了slice_when
,它非常接近:
ary.slice_when { |i, j| i > j }.to_a
#=> [[1, 3, 6, 7, 10], [9, 11, 13], [7, 24]]
Run Code Online (Sandbox Code Playgroud)
但它也在13
和之间分裂7
,所以我必须加入其余的数组:
first, *rest = ary.slice_when { |i, j| i > j }.to_a
[first, rest.flatten(1)]
#=> [[1, 3, 6, 7, 10], [9, 11, 13, 7, 24]]
Run Code Online (Sandbox Code Playgroud)
这看起来有点麻烦.在找到匹配项后继续比较项目似乎效率低下.
我正在寻找基于任意条件的通用解决方案.有数字元素,i > j …
根据ApiDock,Ruby方法Enumerable#each_with_object
已被弃用.除非它是错误的(说"在Rails的最新稳定版本上弃用"让我怀疑可能是Rails的猴子修补已被弃用),为什么它被弃用了?
Enumerable
有first
:
(3..5).to_enum.first
# => 3
Run Code Online (Sandbox Code Playgroud)
但它没有last
:
(3..5).to_enum.last
# => NoMethodError: undefined method `last' for #<Enumerator: 3..5:each>
Run Code Online (Sandbox Code Playgroud)
这是为什么?
是否Enumerable#group_by
保留每个值中的原始订单?当我得到这个:
[1, 2, 3, 4, 5].group_by{|i| i % 2}
# => {1=>[1, 3, 5], 0=>[2, 4]}
Run Code Online (Sandbox Code Playgroud)
是否保证,例如,数组[1, 3, 5]
包含此顺序的元素,而不是,例如[3, 1, 5]
?
有关于这一点的描述吗?
我没有提到钥匙1
和钥匙之间的顺序0
.这是一个不同的问题.
下面的代码是检查执行相同解决方案的三种不同方式的性能.
public static void Main(string[] args)
{
// for loop
{
Stopwatch sw = Stopwatch.StartNew();
int accumulator = 0;
for (int i = 1; i <= 100000000; ++i)
{
accumulator += i;
}
sw.Stop();
Console.WriteLine("time = {0}; result = {1}", sw.ElapsedMilliseconds, accumulator);
}
//Enumerable.Range
{
Stopwatch sw = Stopwatch.StartNew();
var ret = Enumerable.Range(1, 100000000).Aggregate(0, (accumulator, n) => accumulator + n);
sw.Stop();
Console.WriteLine("time = {0}; result = {1}", sw.ElapsedMilliseconds, ret);
}
//self-made IEnumerable<int>
{
Stopwatch sw = Stopwatch.StartNew();
var ret = …
Run Code Online (Sandbox Code Playgroud) enumerable ×10
c# ×5
ruby ×5
linq ×3
arrays ×2
ienumerable ×2
.net ×1
contains ×1
list ×1
performance ×1
python ×1
range ×1
yield ×1