IList<T>
の重複をチェックするバリデーターを作成しました。TKeyを推定できますか?
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var bar = new Foo() {Bar = "buzz"};
var list = new List<Foo>() { }; //Foo has a property named Bar of type string
var validator = new Validator<Foo, string>(x => x.Bar); //I have to specify the type of Bar
validator.IsValid(list);
}
}
}
public class Foo
{
public string Bar { get; set; }
}
public class Validator<T, Tkey>
{
private readonly Func<T, Tkey> _keySelector;
public Validator(Func<T, Tkey> keySelector)
{
_keySelector = keySelector;
}
public bool IsValid(IList<T> list)
{
if (list != null && list.Count > 0)
{
if (list.GroupBy(_keySelector).Any(g => g.Count() > 1))
{
return false;
}
}
return true;
}
}
私はどのように使用する必要がありますか:私は建設中にバーの種類を指定する必要があります。
質問はValidatorを初期化するときに何とかTKeyをスキップできますか?どういうわけか推測できますか?
:
、その後、あなたはこのようにそれを使用することができます:ここで
はどのようにあります'ラムダを取らない。 – DavidG
私はこの質問の「重複とマークされました」と完全に同意しません。もう1つの投稿では、コンストラクタで* why *型の推論が不可能であるかどうかが尋ねられます。この質問は別の方法がある場合です。これは拡張メソッドを使用することにより、レコード:)のために、だから、(実際には他の投稿の質問に記載されている)ファクトリメソッド –
にあります: 'パブリック静的クラスSomeStaticClass { \tパブリック静的検証 GetValidator (このIEnumerableをリスト、のFunc keyselector) \t {\t \t戻り新しいバリ(keyselector)。 \t} } '単純に以下を使用できます:' var list = new List (); // Fooには、String型のBarというプロパティがあります。 \t var validator = list.GetValidator(x => x.Bar); //コンパイラはリストからT(Foo)を知っていて、返されたプロパティのTKeyは ' –