int[][] original =
{
new [] {1,2,3,4,5,6},
new [] {1},
new [] {1,2,3},
new [] {1,2},
new [] {1,2,3},
new [] {1,2,3},
new [] {1,3},
new [] {1,2,3,4,5,6},
};
int[][] anotherList =
original.Select((values, index) => new { values, index })
.GroupBy(x => x.values, SequenceComparer<int>.Default)
.Where(grouping => grouping.Count() > 1) // optional
.Select(grouping => grouping.Select(x => x.index).ToArray())
.ToArray();
I've adapted the definition for SequenceComparer<T>
from here (and here):
public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
{
public static readonly SequenceComparer<T> Default = new SequenceComparer<T>();
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
if (Object.ReferenceEquals(x, y))
return true;
return x != null && y != null && x.SequenceEqual(y);
}
public int GetHashCode(IEnumerable<T> seq)
{
if (seq == null)
return 0;
unchecked
{
const int p = 16777619;
const int hash = (int)2166136261;
return seq.Select(e => e.GetHashCode())
.Aggregate(hash, (a, b) => (a ^ b) * p));
}
}
}