Лучшее решение - заменить цикл foreach или улучшить его - PullRequest
0 голосов
/ 30 ноября 2009

this.entityModel.Entities является источником моего datagrid(agdatagrid).

Я сохранил AutoGenerateColumns="False". у меня есть 6 столбцов в моем agdatgrid

я хочу, чтобы 6-й столбец был виден в зависимости от данных этого столбца .. т.е., если какая-либо строка этого столбца содержит данные, то она должна быть видимой, и если ни одна из строк не содержит данных для этого столбца, она должна быть невидимым.

Итак, я написал цикл foreach, но загрузка данных занимает больше времени, если данные большие. так есть ли другой способ?

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 ]

2 голосов
/ 30 ноября 2009

Сначала посмотрите на логику того, что вы пишете. Вы проверяете, является ли количество коллекций больше нуля внутри цикла, который итерирует по нему; это всегда будет возвращать 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 голос
/ 30 ноября 2009

Я не эксперт в этом вопросе ... но почему вы каждый раз сбрасываете источник данных?

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;

Я думаю, что это должно быть быстрее ... по крайней мере, я на это надеюсь.

0 голосов
/ 30 ноября 2009

Я не разработчик Silverlight, но почему вы проверяете "this.entityModel.Entities.Count> 0" в цикле foreach? Я бы предположил, что при входе в цикл всегда> 0, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...