-7

foreach ループを使用してオブジェクトのリストをループしようとすると、コンパイラ エラーが発生して問題が発生します

の定義が含まれていないため、foreach ステートメントは変数オブジェクトを操作できませんGetEnumerator

ファイルを匿名リストに解析し、そのリストをメソッドで使用します。

     var list = (from s in File.ReadAllLines(path).Select(a => a.Split(new[] { '|' }, StringSplitOptions.None))
                     select new
                     {
                         Nbr = s[0].Trim(),
                         Name = s[1].Trim(),
                         Phone = s[2].Trim(),
                         Addr = s[3].Trim()
                     }).ToList();
 findmatch(list);
}
  Public static void findmatch(object list)
 {
  foreach(var entry in list)

また、次のようにコードを変更しようとしました。

foreach(var entry in list.GetType().GetProperties()) as I still get this error

申し訳ありませんが、リストを別のメソッドに引き継いでいることを認識するために編集を行いました。

4

2 に答える 2

4

問題はまさに説明どおりです: type の変数で iterator を呼び出すことはできませobjectん。あなたのメソッドは を取るobjectので、それはできません。

を使用している理由はobject、明らかにselect、匿名型に ing しているためです。そのため、 List<T>as を宣言するものは何もありません。

あなたがする必要があるのは、具象型を定義し、代わりにメソッドに受け入れさせるList<MyType>か、IEnumerable<MyType>ではなくobject

于 2013-01-03T22:00:12.563 に答える
3

さて、実際のコードを示したので、問題がどこにあるかは明らかです。匿名オブジェクトは、ローカル コンテキストを離れることはできません。のインスタンスをループすることはできませんobject。また、この匿名オブジェクトが定義されているコンテキストの外では、この匿名オブジェクトを使用できません。

モデルを定義することから始めます。

public class MyModel
{
    public string Nbr { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Adr { get; set; }
}

次に、匿名オブジェクトではなく、このモデルの IEnumerable を返すように LINQ クエリを調整します。

var list = 
    from s in File.ReadAllLines(path).Select(a => a.Split(new[] { '|' }, StringSplitOptions.None))
    select new MyModel
    {         
        Nbr = s[0].Trim(),
        Name = s[1].Trim(),
        Phone = s[2].Trim(),
        Addr = s[3].Trim()
    };
findmatch(list);

findmatchそして最後に、とにかく反復できない弱く型付けされたオブジェクトの代わりに、モデルの IEnumerable を取るようにメソッドを適応させます。

public static void findmatch(IEnumerable<MyModel> list)
{
    foreach(var entry in list)
    {
        // do whatever you intended to do with the entry previously
    }
}
于 2013-01-03T22:01:39.207 に答える