迭代通用列表中的记录

时间:2011-10-19 16:09:05

标签: c# linq foreach ienumerable

我有一个列表,我有一个使用linq返回该列表中的一条记录,我想要做的是迭代返回的那条记录,所以我将返回的子列表转换为IEnumerable,但是我有一个foreach语句只发生一次,当我调试时,我明显看到IEnumerable有一个索引,但有几个属性,这就是我想要改变的值

示例:

编辑:

var mylist =MyList.Where(d=>d.Field).First();
foreach( var record in mylist)
{
   foreach( var property in record)
   {
      property=value
   }
   property =value; //this only have to one property in the record
   //bascailly I want to iterate over the nested list in the list
   //essentially every index in the main list is a list itself and
   //I am trying to iterate over that indexed list
}

现在我遇到一个编译问题,声明myList不包含GetEnumerator的公共定义,我不能简单地将列表转换为IEnumerable

编辑2 -

抱歉这令人困惑,它从来都不是一个清单。它是一个IQuerable对象是mylist的结果,我一直看着代码运行

4 个答案:

答案 0 :(得分:1)

你需要2个foreach,因为你有List<List<>>不是吗?

foreach(var element in MyList)
{

    foreach(var property in element)
    {
       //do your thing
    }
}

但您只是在First

上选择MyList元素

答案 1 :(得分:0)

如果你只有一个项目,为什么需要“循环”呢?

var myItem = MyList.Where(d=>d.Field).First();

现在这只是一个项目,而不是IEnumerable

该项目是什么类型的?它只是一些属性的类吗?如果你想循环使用那些你需要使用反射。

答案 2 :(得分:0)

除非我误解这是你的场景列表嵌套在列表中。您正在使用某些条件在parten列表中选择一个项目,并希望在主列表中的该项目的所有子项目上设置属性。如果是这样,以下内容将映射您的方案

class B
    {
        public int x;
    }
    class A
    {

        public int b;
        public List<B> lst = new List<B>();
    }

    static void Main(string[] args)
    {
        List<B> Sub = new List<B>() { new B { x = 2 }, new B { x = 3 } };
        List<B> Sub2 = new List<B>() { new B { x = 4 }, new B { x = 6 } };
        List<A> Main = new List<A>() { new A() {b =2, lst = Sub2 }, new A() {b=3 , lst = Sub  } };

        var newlst = Main.Where((x) => x.b == 2).First().lst.Select((y)=> {y.x = 5;return y;});

        foreach (var item in newlst)
        {
            Console.WriteLine("A.lst(x).x = {0}", item.x);
        }



    }         

答案 3 :(得分:0)

这是能够做到的:

 var mylist =(MYOBJECT)(MyList.Where(d=>d.Field).SingleorDefault());
 PropertyInfo[] myproperties = mylist.GetType().GetProperties();
 foreach( var record in myproperties) { 

      if(record.Name==target) //target is the passed string
 }