【问题标题】:iterate over record in generic list遍历通用列表中的记录
【发布时间】:2011-10-19 16:09:05
【问题描述】:

我有一个列表,我有一个它使用 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 原来是这样,我一直在看代码运行

【问题讨论】:

    标签: c# linq foreach ienumerable


    【解决方案1】:

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

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

    但您只选择了MyList 上的First 元素

    【讨论】:

    • 现在我遇到了一个编译问题,指出 myList 不包含 GetEnumerator 的公共定义,我不能简单地将列表转换为 IEnumerable
    【解决方案2】:

    如果您只有一项,为什么需要“循环”它?

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

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

    物品是什么类型的?它只是一些具有属性的类吗?如果你想遍历那些你需要使用反射。

    【讨论】:

    • 对不起,我不清楚,但 myItem 返回该列表中的索引。哪个索引是记录列表本身,以及我想要循环的内容。该项目是一个具有属性的类
    • 那个类的属性是什么?是否有包含子列表的属性?
    • @Jake 我建议您为您的数据结构绘制一张漂亮的 ASCII 图片并将其发布到您的问题中,因为很难理解您的问题。 Which that index is a list itself of records 是什么意思?
    • 想象一个网格视图,我正在尝试根据网格视图中的编辑更新列表中的该记录/数据行
    • @Jake - 好吧,我在想象,它运行良好。有什么问题?
    【解决方案3】:

    除非我有误解,否则这是嵌套在列表中的场景列表。您正在使用某些标准在部分列表中选择一个项目,并希望在主列表中该项目的所有子项目上设置一个属性。如果是这样,以下将映射您的场景

    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);
            }
    
    
    
        }         
    

    【讨论】:

    • 好吧,您的列表设置得像一个链表,但我的列表本质上是一个表示列表的数据集,所以想象一个我转换为列表的 DB 表,我想遍历其中的一行该表比较列名,但在列表中
    • List 是一个可索引项而不是链表。列表 A 中的项目也包含列表 B 的 ID,这也是一个列表。
    • 抱歉列表是 IQueryable 对象
    【解决方案4】:

    这是能够做到的:

     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
     } 
    

    【讨论】:

    • 为什么不使用循环变量名property 而不是record?似乎不那么令人困惑了。
    • 请参阅 System.Type.GetProperty 的文档,该文档当前位于 msdn.microsoft.com/en-us/library/kz0a8sxy.aspx - 它按名称检索属性,避免手动循环。然后您必须使用property.GetValueproperty.SetValue 来获取或设置属性值。
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 2017-10-14
    • 2022-11-29
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多