Сравните 2 ObservableCollections и выделите различия - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть 2 ObservableCollections, где я сравниваю данные.Если данные отличаются, я добавляю задачу в новую коллекцию ObservableCollection.Теперь мой вопрос: «Есть ли способ выделить одну переменную, которая отличается, чтобы ее легко было найти?».

Вот часть моего кода сравнения:

public void CompareNow()
    {
        Repository onlineRepository = new Repository(App.SharePointSiteLink);
        ObservableCollection<Task> tempLocalTasks = new ObservableCollection<Task>();
        ObservableCollection<Task> tempOnlineTasks = new ObservableCollection<Task>(); 

        tempLocalTasks.Clear();
        tempOnlineTasks.Clear();

        onlineRepository.DownloadTasks();
        onlineRepository.UpdateTasksToShow();
        onlineRepository.UpdateEmployees();
        onlineRepository.UpdateWorkareas();
        onlineRepository.UpdateWorkAreaByEmployee();

        foreach (Task onlineTask in onlineRepository.Tasks)
        {
            foreach (Task localTask in TasksToShow)
            {
                if (localTask.TaskID == onlineTask.TaskID)
                    if (localTask.StartDate != onlineTask.StartDate || localTask.ActualHours != onlineTask.ActualHours || localTask.EstimatedHours != onlineTask.EstimatedHours || localTask.Status != onlineTask.Status || localTask.Priority != onlineTask.Priority || localTask.Category != onlineTask.Category || localTask.TaskName != onlineTask.TaskName)
                    {
                        tempLocalTasks.Add(localTask);
                        tempOnlineTasks.Add(onlineTask);
                    }
            }
        }

        LocalTasks.Clear();
        OnlineTasks.Clear();

        foreach (Task tempLocalTask in tempLocalTasks.OrderBy(x => x.TaskID))
        {
            LocalTasks.Add(tempLocalTask);
        }

        foreach (Task tempOnlineTask in tempOnlineTasks.OrderBy(x => x.TaskID))
        {
            OnlineTasks.Add(tempOnlineTask);
        }

        changesCount = LocalTasks.Count;
    }

Вот мой код просмотра:

<Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="90"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <TextBlock Text="Local tasks" Grid.Column="0" Style="{StaticResource titleStyle}"></TextBlock>
        <TextBlock Text="{Binding ChangesCount}" Grid.Column="1" Style="{StaticResource titleStyle}"></TextBlock>
        <TextBlock Text="Online tasks" Grid.Column="2" Style="{StaticResource titleStyle}"></TextBlock>
        <Button Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Top" Height="20" Width="20" Margin="0,2,5,0" Click="Button_Click">
            <Image Source="/ResourcePlanningTool;component/Images/print.png"></Image>
        </Button>
    </Grid>

    <DockPanel Grid.Column="0" Grid.Row="1">
        <ScrollViewer Name="localScrollViewer" ScrollChanged="localScrollViewer_ScrollChanged" HorizontalScrollBarVisibility="Visible">
            <DataGrid Name="localDatagrid" Grid.ColumnSpan="2" AutoGenerateColumns="False" ItemsSource="{Binding LocalTasks}" IsReadOnly="True" Margin="2" SelectionChanged="localDatagrid_SelectionChanged" PreviewMouseWheel="localDatagrid_PreviewMouseWheel" LoadingRow="localDatagrid_LoadingRow" MouseMove="localDatagrid_MouseMove">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Task ID" Binding="{Binding Path=TaskID}"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=TaskName}" Header="Task name" />
                    <DataGridTextColumn Binding="{Binding Path=TaskResponsible}" Header="Task responsible" />
                    <DataGridTextColumn Binding="{Binding Path=TaskResponsibleDepartment}" Header="Task responsible department"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=Category}" Header="Category" />
                    <DataGridTextColumn Binding="{Binding Path=Status}" Header="Status" ></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=Priority}" Header="Priority" />
                    <DataGridTextColumn Binding="{Binding Path=StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="Start date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=ActualHours.TotalHours, StringFormat={}{0:0}}" Header="Actual hours" />
                    <DataGridTextColumn Binding="{Binding Path=EstimatedHours.TotalHours, StringFormat={}{0:0}}" Header="Estimated hours" />
                    <DataGridTextColumn Binding="{Binding Path=EstimatedDeploymentDate, StringFormat={}{0:yyyy MMMM dd}}" Header="Estimated deployment date" />
                    <DataGridTextColumn Binding="{Binding Path=DesiredImplementationDate, StringFormat={}{0:yyyy MMMM dd}}" Header="Desired deployment date" />
                    <DataGridTextColumn Binding="{Binding Path=APP.StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="APP - Start Date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=APP.EstimatedHours}" Header="APP - Estimated hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=APP.ActualHours}" Header="APP - Actual hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=IN.StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="IN - Start Date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=IN.EstimatedHours}" Header="IN - Estimated hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=IN.ActualHours}" Header="IN - Actual hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=SIS.StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="SIS - Start Date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=SIS.EstimatedHours}" Header="SIS - Estimated hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=SIS.ActualHours}" Header="SIS - Actual hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=Tags}" Header="Tags"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </ScrollViewer>
    </DockPanel>

    <DockPanel Grid.Column="1" Grid.Row="1">
        <ScrollViewer Name="onlineScrollViewer" ScrollChanged="onlineScrollViewer_ScrollChanged" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Visible">
            <DataGrid Name="onlineDatagrid" AutoGenerateColumns="False" ItemsSource="{Binding OnlineTasks}" IsReadOnly="True" Margin="2" SelectionChanged="onlineDatagrid_SelectionChanged" PreviewMouseWheel="onlineDatagrid_PreviewMouseWheel">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Task ID" CellTemplate="{StaticResource hyperlinkTemplate}"></DataGridTemplateColumn>
                    <DataGridTextColumn Binding="{Binding Path=TaskName}" Header="Task name" />
                    <DataGridTextColumn Binding="{Binding Path=TaskResponsible}" Header="Task responsible" />
                    <DataGridTextColumn Binding="{Binding Path=TaskResponsibleDepartment}" Header="Task responsible department"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=Category}" Header="Category" />
                    <DataGridTextColumn Binding="{Binding Path=Status}" Header="Status" ></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=Priority}" Header="Priority" />
                    <DataGridTextColumn Binding="{Binding Path=StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="Start date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=ActualHours.TotalHours, StringFormat={}{0:0}}" Header="Actual hours" />
                    <DataGridTextColumn Binding="{Binding Path=EstimatedHours.TotalHours, StringFormat={}{0:0}}" Header="Estimated hours" />
                    <DataGridTextColumn Binding="{Binding Path=EstimatedDeploymentDate, StringFormat={}{0:yyyy MMMM dd}}" Header="Estimated deployment date" />
                    <DataGridTextColumn Binding="{Binding Path=DesiredImplementationDate, StringFormat={}{0:yyyy MMMM dd}}" Header="Desired deployment date" />
                    <DataGridTextColumn Binding="{Binding Path=APP.StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="APP - Start Date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=APP.EstimatedHours}" Header="APP - Estimated hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=APP.ActualHours}" Header="APP - Actual hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=IN.StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="IN - Start Date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=IN.EstimatedHours}" Header="IN - Estimated hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=IN.ActualHours}" Header="IN - Actual hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=SIS.StartDate, StringFormat={}{0:yyyy MMMM dd}}" Header="SIS - Start Date"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=SIS.EstimatedHours}" Header="SIS - Estimated hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=SIS.ActualHours}" Header="SIS - Actual hours"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding Path=Tags}" Header="Tags"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </ScrollViewer>
    </DockPanel>
</Grid>

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

Я нашел решение сделать это по-другому.Вместо того, чтобы иметь две коллекции результатов, я объединил результат в одну коллекцию, которая только показывает переменные с ошибками.

Вот изображение до

enter image description here

А вот картинка после

enter image description here

0 голосов
/ 07 ноября 2011

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

foreach (Task onlineTask in onlineRepository.Tasks)
{
    foreach (Task localTask in TasksToShow)
    {
        if ((localTask != onlineTask) && (localTask.TaskID == onlineTask.TaskID))
        {
            tempLocalTasks.Add(localTask);
            tempOnlineTasks.Add(onlineTask);
        }
    }
}

, если вы используете вместо вместо foreach, вам понадобится только один цикл.

for (int i=0; i< TasksToShow.Count(); i++) onlineRepository.Tasks)
{
    if ((TasksToShow!= onlineRepository[i].Tasks) && (TasksToShow.TaskID == onlineRepository.Tasks[i].TaskID))
    {
        tempLocalTasks.Add(TasksToShow);
        tempOnlineTasks.Add(onlineRepository.Tasks[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...