【发布时间】:2015-09-05 08:00:13
【问题描述】:
我的代码看起来像这样:
var selectedItems = ItemList.SelectedItems().ToList();
var selectedItems2 = ItemList2.SelectedItems().ToList();
selectedItems[0] = selectedItems2[0];
下面看看SelectedItems扩展方法:
public static IEnumerable<T> SelectedItems<T>(this IEnumerable<T> source) where T : ISelectable
{
return source.Where(s => s.IsSelected);
}
每当我执行ReferenceEquals(ItemList, selectedItems) 时,该值都会返回false,并且每当我修改任何列表中的值时,所做的更改都不会反映在另一个列表中。
ItemList 中的项目是引用类型(自定义类)。
我做错了什么?
编辑:
这是原始代码。我不想让事情变得过于复杂,但仍然如此:
var test = Map.TileMap.Layers[0].TileList.SelectedItems().ToList();
if (ReferenceEquals(test[0], Map.TileMap.Layers[0].TileList[0]))
{
// returns true
}
var tileset2D = Tileset.TileMap.Layers[0].TileList.SelectedItems().To2D(t => t.SelectableRegion.Y).ToList();
test[0] = tileset2D[0][0];
// test[0] has changed but Tileset.TileMap.Layers[0].TileList[0] hasn't changed.
To2D 扩展方法如下:
public static IEnumerable<IEnumerable<T>> To2D<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source), "Source collection cannot be null");
}
return source.GroupBy(keySelector);
}
【问题讨论】:
-
ItemList的来源是什么?IQueryable/List<T>/etc.? -
列表
。 T 是 ISelectable。 -
几乎听起来该列表已经由不同的实体构成。你确定过滤前的
ReferenceEquals(ItemList[0], ItemList2[0]) == true?
标签: c# linq list reference ienumerable