タグ付けされた質問 「extension-methods」

拡張メソッドは、Swift、Visual Basic.NET、C#などの一部の言語の言語機能です。拡張メソッドを使用すると、新しい派生型を作成したり、再コンパイルしたり、元の型を変更したりすることなく、既存の型にメソッドを「追加」できます。


18
ラムダとDistinct()?
そうです、私は列挙可能であり、そこから明確な値を取得したいと考えています。 使用してSystem.Linq、と呼ばれる拡張メソッドは、もちろんありますDistinct。単純なケースでは、次のようにパラメーターなしで使用できます。 var distinctValues = myStringList.Distinct(); ええと、いいのですが、等価性を指定する必要があるオブジェクトの列挙可能オブジェクトがある場合、使用できる唯一のオーバーロードは次のとおりです。 var distinctValues = myCustomerList.Distinct(someEqualityComparer); 等価比較引数はのインスタンスでなければなりませんIEqualityComparer<T>。もちろん、私はこれを行うことができますが、それはいくぶん冗長で、まあまあです。 私が期待していたのは、ラムダをとるオーバーロード、たとえばFunc <T、T、bool>です。 var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId); 誰かがそのような拡張機能が存在するかどうか、または同等の回避策を知っていますか?それとも何か不足していますか? または、インラインでIEqualityComparerを指定する方法はありますか(私を当惑させます)? 更新 この件に関するMSDNフォーラムの投稿に対するAnders Hejlsbergからの返信を見つけました。彼は言う: あなたが遭遇する問題は、2つのオブジェクトが等しい場合、それらは同じGetHashCode戻り値を持つ必要があることです(そうしないと、Distinctによって内部的に使用されるハッシュテーブルが正しく機能しません)。EqualsとGetHashCodeの互換性のある実装を単一のインターフェイスにパッケージ化するため、IEqualityComparerを使用します。 それは理にかなっていると思います

8
.Any()と.Count()> 0のどちらの方がパフォーマンスが優れていますか?
でSystem.Linq、名前空間、私たちは今、私たち拡張することができますIEnumerableをのを持っている(どれを)と()カウント 拡張メソッドを。 コレクション内に1つ以上のアイテムが含まれていることを確認する場合、拡張メソッドはすべてのアイテムを反復処理する必要があるため、.Any()拡張メソッドの代わりに拡張メソッドを使用する必要があると最近言われました。.Count() > 0.Count() 第2に、一部のコレクションには、または(拡張メソッドではなく)プロパティがあります。またはの代わりにそれらを使用する方が良いでしょうか?CountLength.Any().Count() いや/いや?

15
既存の静的クラスに拡張メソッドを追加できますか?
私はC#の拡張メソッドのファンですが、拡張メソッドをコンソールなどの静的クラスに追加することに成功していません。 たとえば、「WriteBlueLine」と呼ばれる拡張機能をコンソールに追加したい場合は、次のようにします。 Console.WriteBlueLine("This text is blue"); 私はこれを、「this」パラメーターとしてConsoleを使用してローカルのパブリック静的メソッドを追加することで試してみました... 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が実装され、ユニットテストが行​​われました。 2008年11月11日より多くの開発者のための余地がまだあります。;-) 今すぐ参加! 11.11.2008 3番目の寄稿者がExtensionOverflowに参加しました。BKristensenへようこそ 11.11.2008 FormatWithが実装され、ユニットテストが行​​われました。 2008/09/11 2番目の寄稿者がExtensionOverflowに参加しました。チャクリットへようこそ。 09.11.2008さらに開発者が必要です。;-) 09.11.2008 ThrowIfArgumentIsNullが実装され、Codeplexでユニットテストが行われました。



6
LINQを使用して、1行のコードで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。 ここで「let」キーワードの機能を実現するLINQ拡張メソッド呼び出しの同等のセットは何ですか?

14
C#拡張メソッドに相当するJava
拡張メソッドを使用して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(); } ミックスインを使用してこのインターフェースを拡張しました... 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 Extensions(またはビューの他の名前空間)が見つかりません
これがPRまたはベータ版で発生した場合はDunnoですが、で拡張メソッドを作成した場合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でのリソースの試用
tryKotlinでJava -with-resourcesコードに相当するコードを記述しようとしたところ、うまくいきませんでした。 次のさまざまなバリエーションを試しました。 try (writer = OutputStreamWriter(r.getOutputStream())) { // ... } しかしどちらも機能しません。 誰かが代わりに何を使うべきか知っていますか?どうやらKotlin文法にはそのような構成の定義がありませんが、おそらく何かが足りません。これは、tryブロックの文法を次のように定義します。 try : "try" block catchBlock* finallyBlock?;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.