我有Cell
个对象,其中包含名为List<int>
的{{1}}。我正在尝试找到一种方法来获取所有成员都匹配PossibleValues的单元格列表。我目前有:
PossibleValues
不幸的是这不起作用,我怀疑我的linq语句不是比较PossibleValues的内容,而是比较某种类型的引用,所以即使在两个列表都由3组成的情况下,也没有别的, cellsWithMatchingPossibleValues最终只包含一个单元格,虽然我不确定,或者确定如何绕过它。
将问题正式化: 如何根据匹配的列表返回包含列表的对象?
答案 0 :(得分:2)
您可以实施IEqualityComparer
界面并使用GroupBy
方法。
在这里,您可以找到适用于列表的GetHashCode,以及here如何比较列表。
public class PossibleValuesCellComparer : IEqualityComparer<Cell>
{
public bool Equals(Cell x, Cell y)
{
return Enumerable.SequenceEqual(x.PossibleValues.OrderBy(t => t), y.PossibleValues.OrderBy(t => t));
}
public int GetHashCode(Cell cell)
{
var list = cell.PossibleValues.OrderBy(t => t);
unchecked
{
int hash = 19;
foreach (var obj in list)
{
hash = hash * 31 + obj.GetHashCode();
}
return hash;
}
}
}
....
var g2 = group.GroupBy(x => x, new PossibleValuesCellComparer());
答案 1 :(得分:2)
您可以为IEqualityComparer<Cell>
类实现自己的Cell
,当PossibleValues
与此类似时,该public class CellComparer : IEqualityComparer<Cell>
{
public bool Equals(Cell x, Cell y)
{
if (ReferenceEquals(x, null)) return ReferenceEquals(y, null);
if (ReferenceEquals(y, null)) return false;
return x.PossibleValues.SequenceEqual(y.PossibleValues);
}
public int GetHashCode(Cell obj)
{
if (obj == null) return 0;
unchecked
{
int hash = 1;
foreach (int h in obj.PossibleValues.Select(v => v?.GetHashCode() ?? 0))
hash = (hash * 397) ^ h;
return hash;
}
}
}
类表示相等:
var cellsGroupedByEqualValues = group.GroupBy(c => c, new CellComparer());
然后你可以将它用于这样一个简单的LINQ分组:
IEnumerable<IGrouping<Cell,Cell>>
这将返回foreach(var groupedCells in cellsGroupedByEqualValues)
Console.WriteLine(groupedCells.Count());
,您可以遍历它并接收匹配单元格的数量:
GroupBy
但是这些包含重复项,因为IGrouping
为每个Cell
生成Cell
并将所有匹配的单元格添加到其中。 (仍然试图找到一个好办法)
但是现在你可以告诉每个 Cell
有多少其他\App::call('App\Http\Controllers\MyController@getFoo')
具有相同的值列表。