我有一个专门的列表,其中包含 IThing 类型的项目:
public class ThingList : IList<IThing>
{...}
public interface IThing
{
Decimal Weight { get; set; }
Decimal Velocity { get; set; }
Decimal Distance { get; set; }
Decimal Age { get; set; }
Decimal AnotherValue { get; set; }
[...even more properties and methods...]
}
有时我需要知道列表中所有事物的某个属性的最大值或最小值。因为“告诉不要问”,我们让 List 自己搞定:
public class ThingList : IList<IThing>
{
public Decimal GetMaximumWeight()
{
Decimal result = 0;
foreach (IThing thing in this) {
result = Math.Max(result, thing.Weight);
}
return result;
}
}
太好了。但有时我需要最小重量,有时需要最大速度等等。我不希望每个属性都有 GetMaximum*()/GetMinimum*() 对。
一种解决方案是反射。类似于(捂住 Nose ,强烈的代码味道!):
Decimal GetMaximum(String propertyName);
Decimal GetMinimum(String propertyName);
有没有更好的、气味更小的方法来实现这一点?
谢谢, 埃里克
编辑:@Matt:.Net 2.0
结论:.Net 2.0(使用 Visual Studio 2005)没有更好的方法。也许我们应该尽快转向 .Net 3.5 和 Visual Studio 2008。谢谢,伙计们。
结论:有多种方法比反射好得多。取决于运行时和 C# 版本。看看 Jon Skeets 的不同之处。所有答案都非常有帮助。
我会寻求 Sklivvz 的建议(匿名方法)。有几个来自其他人(Konrad Rudolph、Matt Hamilton 和 Coincoin)的代码片段实现了 Sklivvz 的想法。不幸的是,我只能“接受”一个答案。
非常感谢。你们都会感到“被接受”,尽管只有 Sklivvz 获得了荣誉 ;-)
最佳答案
(编辑以反射(reflect) .NET 2.0 答案,以及 VS2005 中的 LINQBridge...)
这里有三种情况——虽然OP只有.NET 2.0,但其他面临同样问题的人可能没有...
1) 使用 .NET 3.5 和 C# 3.0:像这样使用 LINQ to Objects:
decimal maxWeight = list.Max(thing => thing.Weight);
decimal minWeight = list.Min(thing => thing.Weight);
2) 使用 .NET 2.0 和 C# 3.0:使用 LINQBridge和相同的代码
3) 使用 .NET 2.0 和 C# 2.0:使用 LINQBridge和匿名方法:
decimal maxWeight = Enumerable.Max(list, delegate(IThing thing)
{ return thing.Weight; }
);
decimal minWeight = Enumerable.Min(list, delegate(IThing thing)
{ return thing.Weight; }
);
(我没有 C# 2.0 编译器来测试上面的内容 - 如果它提示转换不明确,请将委托(delegate)转换为 Func
LINQBridge 可以与 VS2005 一起使用,但您不会获得扩展方法、lambda 表达式、查询表达式等。显然迁移到 C# 3 是一个更好的选择,但我更喜欢使用 LINQBridge 自己实现相同的功能。 如果您需要同时获得最大值和最小值,所有这些建议都涉及遍历列表两次。如果您遇到从磁盘延迟加载或类似情况的情况,并且您想一次性计算多个聚合,您可能需要查看我的 "Push LINQ"。 MiscUtil 中的代码. (这也适用于 .NET 2.0。)
关于C#:获取列表中所有项目的任意属性的最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/152613/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url