更好的解决方案取代foreach循环或改进它

时间:2009-11-30 11:05:09

标签: c# silverlight

this.entityModel.Entitiesdatagrid(agdatagrid)的来源。

我保留了AutoGenerateColumns="False"。 我的agdatgrid

中有6列

我希望第6列可见,具体取决于该列的数据..如果该列的任何行包含数据,那么它应该是可见的,如果该行中没有任何行包含该列的数据,它应该是是看不见的。

所以我编写了一个foreach循环,但如果数据很大,则需要更多时间来加载ui。还有其他方法吗?

foreach (BrowserEntity _browseEntity in this.entityModel.Entities)
{
            if (_browseEntity.State != null && this.entityModel.Entities.Count>0)
            {
                this.grid.DataSource = this.entityModel.Entities;
                this.grid.Columns[6].Visible = true;
                break;
            }
            else
            {

                this.grid.DataSource = this.entityModel.Entities;
                this.grid.Columns[6].Visible = false;
            }
}

3 个答案:

答案 0 :(得分:2)

首先看一下你所写内容的逻辑。你在迭代它的循环中检查一个集合的计数是否大于零;这将始终返回true,因为如果集合包含任何内容,循环将不会运行。所以你实际写的就是这个,当总是返回true或者不能执行的代码被删除时:

foreach (BrowserEntity _browseEntity in this.entityModel.Entities)
{
    if (_browseEntity.State != null)
    {
        this.grid.DataSource = this.entityModel.Entities;
        this.grid.Columns[6].Visible = true;
        break;
    }
}

所以你要多次分配数据源,并且从不将Visible设置为false,而我认为你实际上要编写的是这样的:

// bind the grid but hide column 6
this.grid.DataSource = this.entityModel.Entities;
this.grid.Columns[6].Visible = false;

// if there is any state then show column 6
foreach (BrowserEntity _browseEntity in this.entityModel.Entities)
{
     if (_browseEntity.State != null)
     {
         this.grid.Columns[6].Visible = true;
         break;
     }
}

或者,使用Linq,这可以写成如下,实现相同的目的,但更清晰:

this.grid.DataSource = this.entityModel.Entities;
this.grid.Columns[6].Visible = this.entityModel.Entities.Any(e => e.State != null);

答案 1 :(得分:1)

我不是这方面的专家......但为什么每次都要重置DataSource?

bool isColumnVisible = false;
this.grid.DataSource = this.entityModel.Entities;
foreach (BrowserEntity _browseEntity in this.entityModel.Entities)
{
            if (_browseEntity.State != null && this.entityModel.Entities.Count>0)
            {
                isColumnVisible = true;
                break;
            }
}
this.grid.Columns[6].Visible = isColumnVisible;

我认为这应该更快......至少我希望如此。

答案 2 :(得分:0)

我不是一个Silverlight开发人员,但为什么要在foreach循环中检查“this.entityModel.Entities.Count> 0”?我假设当你进入循环时,计数总是> 0;不是吗?