2

私はリストを持っていますAllIDs

List<IAddress> AllIDs = new List<IAddress>();

文字「_」に基づいてsubstringメンバーフィールドを操作したい。AddressId

以下の LINQ クエリを使用していますが、コンパイル エラーが発生します。

AllIDs= AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_"))
    .Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_")))
    .ToList();

エラー:

タイプ 'System.Collections.Generic.List<string>' を 'System.Collections.Generic.List<MyCompany.Common.Users.IAddress>' に暗黙的に変換することはできません

4

3 に答える 3

3

AllIDsは のリストですIAddressが、 を選択していstringます。List<string>コンパイラは、 aを a に変換できないと不平を言っていList<IAddress>ます。代わりに次のことを意味しましたか?

var substrings = AllIDs.Where(...).Select(...).ToList();
于 2012-10-12T05:46:52.017 に答える
0

多分これ?

var boundable  = 
    from s id in AllIDs
    where s.AddressId.Length >= s.AddressId.IndexOf("_")
    select new { AddressId = s.AddressId.Substring(s.AddressId.IndexOf("_")) };
boundable = boundable.ToList();
于 2012-10-12T12:51:54.663 に答える
0

Addressそれらをオブジェクトに戻したい場合(インターフェースAddressに加えてクラスがあると仮定IAddress)、次のようにすることができます (コンストラクターAddressが配置されていると仮定します):

AllIDs = AllIDs.Where(...).Select(new Address(s.AddressID.Substring(s.AddressID.IndexOf("_")))).ToList();

また、メソッド構文の代わりに LINQ のクエリ構文を使用することも検討する必要があります。これにより、このような多くのクエリをクリーンアップして読みやすさを向上させることができます。元の (変更されていない) クエリは、これとほぼ同じです。

var substrings = from a in AllIDs
                 let id = a.AddressId
                 let idx = id.IndexOf("_")
                 where id.Length >= idx
                 select id.Substring(idx);

これは実際には単なるスタイルの問題であり、これはオリジナルと同じものにコンパイルされます。わずかな違いString.IndexOf()の 1 つは、エントリごとに 2 回ではなく、エントリごとに 1 回だけ呼び出す必要があることです。 letあなたの友達です。

于 2012-10-12T06:56:26.180 に答える