Foreach遍历ObservableCollection

时间:2010-01-07 10:35:28

标签: c# wpf linq generics foreach

在WPF应用程序中,我使用LINQ查询从ObservableCollection获取值并更新某些对象的状态:

var shava = from clc in _ShAvaQuCollection where clc.xyID == "x02y02" select clc;

        switch (shava.First().Status)
        {
            case 1:
                x02y02.Status = MyCustControl.Status.First;
                break;
            case 2:
                x02y02.Status = MyCustControl.Status.Second;
                break;
           ...
         }

实际上,xyID是此ObservableCollection中的唯一字段,其字符串值对应于XAML中对象的名称(这些对象派生自客户控件 MyCustControl)。

我想做的是:

(1)遍历_ShAvaQuCollection中的所有记录,并使用xyID字段引用每个特定对象,使用shava作为对每条记录的查询结果:

MyCustControl sc = (MyCustControl)this.FindName(shava.First().xyID);

(2)并使用此记录中的其他值更新对象的状态,例如:

           switch (shava.First().Status)
        {
            case 1:
                sc.Status = MyCustControl.Status.First;
                break;
            case 2:
                sc.Status = MyCustControl.Status.Second;
                break;
           ...
         }  

所有这些操作分开工作得很好,但是我无法将它与一个工作的迭代方法结合起来,就像这样(这只是一个想法,因为我没有设法获得可编译的代码):

public void ReadingCollection(System.Collections.Generic.IEnumerable<ShowAvaQu> coll)
{
   foreach (var xyid in coll)
        {
            //do my actions (1) and (2)
        } 
}

请帮助我在foreach循环中的最后一段代码中组织这样的迭代。我在理解如何对循环内的集合的每个特定记录进行查询时遇到问题。

我描述了以上所有内容,只是为了弄清楚我打算在这个循环中对这样的查询结果做些什么。

2 个答案:

答案 0 :(得分:3)

您似乎需要获取一系列ShowAvaQu个对象,使用MyCustControl将其转换为FindName序列,并根据状态更新每个控件的状态每个ShowAvaQu

首先,让我们关联状态和控件:

var shavaControls =
    from shava in coll
    select new
    {
        Status = shava.Status,
        Control = (MyCustControl) this.FindName(shava.xyID)
    };

然后,迭代该序列,根据需要更新状态:

foreach(var shavaControl in shavaControls)
{
    switch(shavaControl.Status)
    {
        case 1:
        shavaControl.Control.Status = MyCustControl.Status.First;
        break;
        case 2:
        shavaControl.Control.Status = MyCustControl.Status.Second;
        break;
        //...
    }
}

看起来不错吗?

答案 1 :(得分:1)

我似乎设法做到了这一点(并且有效):

 public void ReadingCollection(System.Collections.Generic.IEnumerable<ShowAvaQu> coll)
   {
        foreach (var id in coll)
        {               
            MyCustControl sc = (MyCustControl)this.FindName(id.xyID);
            switch (id.Status)
            {
                case 1:
                    sc.Status = MyCustControl.Status.First;
                    break;
                case 2:
                    sc.Status = MyCustControl.Status.Second;
                    break;
                case 3:
                    sc.Status = MyCustControl.Status.Third;
                    break;
                default:
                    break;
           }
        }
    }