Questions tagged «extension-methods»

扩展方法是某些语言的语言功能,例如Swift,Visual Basic.NET和C#。扩展方法使您可以将方法“添加”到现有类型,而无需创建新的派生类型,重新编译或修改原始类型。


18
与lambda不同()?
是的,所以我有一个不可估量的并希望从中获得独特的价值。 使用System.Linq,当然有一个扩展方法称为Distinct。在简单的情况下,可以不使用任何参数,例如: var distinctValues = myStringList.Distinct(); 很好,但是如果我有一个需要枚举的对象枚举,则唯一可用的重载是: var distinctValues = myCustomerList.Distinct(someEqualityComparer); 相等比较器参数必须是的实例IEqualityComparer<T>。我当然可以做到这一点,但这有点冗长,而且很笨拙。 我本来希望是一个过载,它需要一个lambda,例如Func <T,T,bool>: var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId); 任何人都知道是否存在这样的扩展名或等效的解决方法?还是我错过了什么? 另外,有没有一种方法可以指定内联IEqualityComparer(使我感到尴尬)? 更新资料 我发现Anders Hejlsberg对MSDN论坛中有关此主题的帖子进行了回复。他说: 您将遇到的问题是,当两个对象比较相等时,它们必须具有相同的GetHashCode返回值(否则Distinct内部使用的哈希表将无法正常运行)。我们使用IEqualityComparer,因为它会将Equals和GetHashCode的兼容实现打包到单个接口中。 我想这是有道理的。

8
哪种方法效果更好:.Any()与.Count()> 0?
在System.Linq名称空间中,我们现在可以将IEnumerable扩展为具有Any()和Count() 扩展方法。 最近有人告诉我,如果我要检查集合中是否包含1个或多个项目,则应该使用.Any()扩展方法而不是.Count() > 0扩展方法,因为.Count()扩展方法必须遍历所有项目。 其次,一些集合具有属性(未扩展方法),其是Count或Length。使用这些代替而不是.Any()或会更好.Count()? 是/否?

15
我可以向现有的静态类添加扩展方法吗?
我很喜欢C#中的扩展方法,但是将扩展方法添加到静态类(例如Console)并没有取得成功。 例如,如果我想向控制台添加一个名为“ WriteBlueLine”的扩展,以便可以进行以下操作: Console.WriteBlueLine("This text is blue"); 我通过添加一个本地的,公共的静态方法(使用Console作为“ this”参数)来尝试了此操作……但是没有骰子! public static class Helpers { public static void WriteBlueLine(this Console c, string text) { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine(text); Console.ResetColor(); } } 这没有向控制台添加'WriteBlueLine'方法...我做错了吗?还是要求不可能?

30
您最喜欢的C#扩展方法是什么?(codeplex.com/extensionoverflow)
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 让我们列出一个答案列表,在其中发布优秀和最喜欢的扩展方法。 要求是必须张贴完整的代码,并提供示例和使用说明。 基于对该主题的高度兴趣,我在Codeplex上建立了一个名为extensionoverflow的开源项目。 请标记您的答案并接受,以将代码放入Codeplex项目。 请发布完整的源代码,而不发布链接。 Codeplex新闻: 24.08.2010现在,“ Codeplex”页面位于此处:http ://extensionoverflow.codeplex.com/ 11.11.2008 XmlSerialize / XmlDeserialize现在已实现并进行了单元测试。 11.11.2008还有更多开发者的空间。;-) 立即加入! 11.11.2008第三位贡献者加入了ExtensionOverflow,欢迎来到BKristensen 11.11.2008 FormatWith现在已实现并进行了单元测试。 2008年9月11日第二位贡献者加入了ExtensionOverflow。欢迎来到chakrit。 2008年9月11日我们需要更多开发人员。;-) 2008年9月11日ThrowIfArgumentIsNull在现在实现和进行单元测试 Codeplex上。



6
使用LINQ在一行代码中将string []转换为int []
我有一个字符串形式的整数数组: var arr = new string[] { "1", "2", "3", "4" }; 我需要一个“实”整数数组来进一步推它: void Foo(int[] arr) { .. } 我试图转换int,但它当然失败了: Foo(arr.Cast<int>.ToArray()); 我可以下一步: var list = new List<int>(arr.Length); arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better? Foo(list.ToArray()); 要么 var list = new List<int>(arr.Length); arr.ForEach(i => { int j; if (Int32.TryParse(i, out …

9
扩展方法必须在非通用静态类中定义
我收到错误消息: 扩展方法必须在非通用静态类中定义 在线上: public class LinqHelper 这是基于Mark Gavells代码的帮助程序类。我对这个错误的含义感到非常困惑,因为我确信当我在星期五离开它时,它可以正常工作! using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Linq.Expressions; using System.Reflection; /// <summary> /// Helper methods for link /// </summary> public class LinqHelper { public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderBy"); } public static IOrderedQueryable<T> …

4
等效于链接的LINQ扩展方法调用中的'let'关键字的代码
使用C#编译器查询理解功能,您可以编写如下代码: var names = new string[] { "Dog", "Cat", "Giraffe", "Monkey", "Tortoise" }; var result = from animalName in names let nameLength = animalName.Length where nameLength > 3 orderby nameLength select animalName; 在上面的查询表达式中,let关键字允许将值转发给where和orderby操作,而无需重复调用animalName.Length。 什么是LINQ扩展方法调用的等效集合,可以实现此处的“ let”关键字呢?

14
Java等同于C#扩展方法
我希望在对象列表中实现功能,就像在C#中使用扩展方法一样。 像这样: List<DataObject> list; // ... List initialization. list.getData(id); 如何在Java中做到这一点?

6
使用C#扩展方法重载运算符
我正在尝试使用扩展方法将操作员重载添加到C#StringBuilder类。具体来说,StringBuilder sb我想sb += "text"等同于sb.Append("text")。 这是为创建扩展方法的语法StringBuilder: public static class sbExtensions { public static StringBuilder blah(this StringBuilder sb) { return sb; } } 成功将blah扩展方法添加到中StringBuilder。 不幸的是,操作符重载似乎不起作用: public static class sbExtensions { public static StringBuilder operator +(this StringBuilder sb, string s) { return sb.Append(s); } } 除其他问题外,this此上下文中不允许使用关键字。 通过扩展方法可以添加运算符重载吗?如果是这样,解决该问题的正确方法是什么?

7
Moq模拟扩展方法
我已有一个接口... public interface ISomeInterface { void SomeMethod(); } 我已经使用mixin扩展了这个界面 public static class SomeInterfaceExtensions { public static void AnotherMethod(this ISomeInterface someInterface) { // Implementation here } } 我有一个类,这就是我想测试的。 public class Caller { private readonly ISomeInterface someInterface; public Caller(ISomeInterface someInterface) { this.someInterface = someInterface; } public void Main() { someInterface.AnotherMethod(); } } …

8
找不到Razor HtmlHelper扩展(或其他视图名称空间)
Dunno,如果这是在PR或Beta中发生的,但是如果我在上创建了扩展方法HtmlHelper,则在Razor支持的页面中无法识别该方法: namespace SomeNamespace.Extensions { public static class HtmlExtensions { public static string Foo(this HtmlHelper html) { return "Foo"; } } } 我将其添加到的<Namespaces>部分中Web.config: <pages> <namespaces> <add namespace="System.Web.Mvc" /> <!-- snip --> <add namespace="SomeNamespace.Extensions"/> </namespaces> </pages> 但是在尝试查看页面时会引发编译错误: @Html.Foo() 如果我使用WebForms重新创建页面,则效果很好。这是怎么回事? 解决方法 如果我将其包含@using SomeNamespace.Extensions在Razor视图中,则可以使用,但我宁愿将其包含在其中Web.config

4
Kotlin的尝试资源
当我尝试try用Kotlin 编写与Java相同的带有资源的代码时,它对我不起作用。 我尝试了以下各种变化: try (writer = OutputStreamWriter(r.getOutputStream())) { // ... } 但是两者都不起作用。 有谁知道应该用什么代替?显然Kotlin语法没有为这种结构定义,但也许我遗漏了一些东西。它为try块定义语法,如下所示: try : "try" block catchBlock* finallyBlock?;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.