[英]Compare 2 ObservableCollections and highlight differences
我有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>
我不认为有一种快速的方法可以做到这一点,但是您可以减少这种情况
foreach (Task onlineTask in onlineRepository.Tasks)
{
foreach (Task localTask in TasksToShow)
{
if ((localTask != onlineTask) && (localTask.TaskID == onlineTask.TaskID))
{
tempLocalTasks.Add(localTask);
tempOnlineTasks.Add(onlineTask);
}
}
}
另外,如果使用for而不是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]);
}
}
我找到了其他方法的解决方案。 我所做的是不是将两个结果集合合并到一个集合中,而是仅显示有错误的变量,而不是使用两个结果集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.