LINQ with ObservableCollection

时间:2014-04-16 14:10:08

标签: c# linq list observablecollection

我有一个ObservableCollection属性,我需要使用LINQ进行操作。

我想要做的是根据商品的属性拍摄第一个收藏品并从其他收藏品中移除商品。

这是我到目前为止所做的:

ItemsObservableCollection = ItemsObservableCollection.Where(i=>!selectedItemsObservableCollection.Any(y=> y.name == i.Name);

如果我这样做,我会收到一个强制转换错误,指出我无法将IEnumerable转换为ObservableCollection。如果我将值保存到var中,它就完全符合我的要求:

    var collectionItems= ItemsObservableCollection.Where(i=>!selectedItemsObservableCollection.Any(y=> y.name == i.Name);

但我需要它来更新ObservableCollection属性。

3 个答案:

答案 0 :(得分:2)

您可以从原始文件中删除所需的项目,而不是创建新的集合。例如,如果您在WPF中工作并将可观察集合绑定到控件,则这是首选。

var itemsToRemove = ItemsObservableCollection.Where(
    i => !selectedItemsObservableCollection.Any(y => y.name == i.Name)).ToList();

foreach (var item in itemsToRemove)
    ItemsObservableCollection.Remove(item);

(必须使用 ToList() 以避免“收集被修改”错误。)

答案 1 :(得分:1)

嗯,你有一个ObservableCollection ctor,需要IEnumerable<T>

所以你可能会这样做

ItemsObservablecollection = new ObservableCollection<DesiredType>(ItemsObservableCollection.Where(i=>!selectedItemsObservableCollection.Any(y=> y.name == i.Name));

答案 2 :(得分:0)

您需要我的ObservableComputations库。这是.NET API,用于在INotifyPropertyChangedINotifyCollectionChanged(ObservableCollection)对象上进行计算。计算结果是INotifyPropertyChanged和INotifyColectionChanged(ObservableCollection)对象。

使用该库,您可以像这样进行编码:

<?php
$wp_page_id = 745;

//I have a table of data which I got from another non-wordpress site
$external_page_id = "247";
$sql = "SELECT data FROM `DataObject` WHERE `parent` = '$external_page_id' AND `public` = '1'";
$mydata = $wpdb->get_results($sql);

if ( !empty($mydata) ) {

    $fc_data = array(
        'flexible_content_field_key'          => 'field_5dbc1c6d966de',
        'flexible_content_layout'             => 'accordion',
        'flexible_content_repeater_field_key' => 'field_5dc52a904eb2b',
    );

    // making the array of data for repeater fields inside flexible content
    $tmp = array();

    foreach ($mydata as $key => $value) {
        $json = json_decode( $value->data, true );

        $data_to_insert = array(
            'field_5dc52aa64eb2c' => $json['title'], // title field in repeater
            'field_5dc52ae44eb2d' => $json['accordion-content'] // content field in repeater
        );

        array_push($tmp, $data_to_insert);
    }

    // got final array of all repeater field data. Now putting it into the final array of data
    $fc_data['data_to_insert'] = $tmp;

    // making the final array of data
    $fc_rows = array(
        array(
            'acf_fc_layout' => $fc_data['flexible_content_layout'],
            $fc_data['flexible_content_repeater_field_key'] => $tmp
        )
    );

    // now insert the array of data
    update_field($fc_data['flexible_content_field_key'], $fc_rows, $wp_page_id);
}

collectionItems为ObservableCollection,它反映了ItemsObservableCollection集合和Name属性中的所有更改。确保上面代码中提到的所有属性都通过INotifyPropertyChanged界面通知更改。