返回包含列表的对象,基于匹配的列表

时间:2016-03-13 14:12:41

标签: c# linq

我有Cell个对象,其中包含名为List<int>的{​​{1}}。我正在尝试找到一种方法来获取所有成员都匹配PossibleValues的单元格列表。我目前有:

PossibleValues

不幸的是这不起作用,我怀疑我的linq语句不是比较PossibleValues的内容,而是比较某种类型的引用,所以即使在两个列表都由3组成的情况下,也没有别的, cellsWithMatchingPossibleValues最终只包含一个单元格,虽然我不确定,或者确定如何绕过它。

将问题正式化: 如何根据匹配的列表返回包含列表的对象?

2 个答案:

答案 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') 具有相同的值列表。