Filtered CollectionView Gives Wrong Count

2020-08-16 03:07发布

According to the documentation, the Count of a filtered CollectionView should only be the count of items that pass the filter. Given this code:

List<string> testList = new List<string>();
testList.Add("One");
testList.Add("Two");
testList.Add("Three");
testList.Add("1-One");
testList.Add("1-Two");
testList.Add("1-Three");
CollectionView testView = new CollectionView(testList);
int testCount1 = testView.Count;
testView.Filter = (i) => i.ToString().StartsWith("1-");
int testCount2 = testView.Count;

I would therefore expect testCount1 to be 6, and testCount2 to be 3. However, both are 6. If I manually iterate through the CollectionView and count the items, I do get 3, but Count returns 6 always.

I've tried calling Refresh on the CollectionView, just to see if that would correct the result, but there was no change. Is the documentation wrong? Is there a bug in CollectionView? Am I doing something wrong that I just can't see?

3条回答
做个烂人
2楼-- · 2020-08-16 03:15

There seems a bug, I checked reflector may be if you try calling "Refresh" that should give you correct Count. As per documentation, they say that you do not need to call Refresh as setting filter will refresh it automatically but I think it is not happening as they also mention that they cache the value of count from last change.

It would work perfect if you set the Filter before you add items. Or you will have to call Refresh.

查看更多
淡お忘
3楼-- · 2020-08-16 03:16

Try

ICollectionView _cvs = CollectionViewSource.GetDefaultView(testList);

instead of

CollectionView testView = new CollectionView(testList);    
查看更多
【Aperson】
4楼-- · 2020-08-16 03:27

If you switch to ListCollectionView, then it works as expected:

CollectionView testView = new ListCollectionView(testList);
int testCount1 = testView.Count;
testView.Filter = (i) => i.ToString().StartsWith("1-");
int testCount2 = testView.Count;

This seems to work for CollectionView, so this definitely points to a bug:

CollectionView testView = new CollectionView(this.GetTestStrings());

private IEnumerable<string> GetTestStrings() {
    yield return "One";
    yield return "Two";
    yield return "Three";
    yield return "1-One";
    yield return "1-Two";
    yield return "1-Three";
}
查看更多
登录 后发表回答