我的目标是在数组或列表中查找数字对。在这种情况下,一对由两个条目之间的最大差异定义。例如
1
50
2
100
102
800
与行号(数组编号)的对(如果最大差异阈值为2):
1,2 line number of 1 is 0
100,101 line number of 100 is 3
我该怎么做?
答案 0 :(得分:2)
没有库,你可以对数组进行排序,然后在循环中进行itterayt查找对。
答案 1 :(得分:2)
我不知道任何图书馆会帮助你解决这个问题。您可以使用框架中的方法。
对于阈值为1的情况,如果将数组中的数字放在哈希集中,则可以有效地查找作为对的一部分的数字:
HashSet<int> set = new HashSet<int>(myArray);
int[] pairs = myArray.Where(i => set.Contains(i + 1)).ToArray();
pairs
数组的对数较少,例如当{ 1, 100 }
和1, 2
成对时,100, 101
。
要获取索引而不是数字,请改为迭代索引:
HashSet<int> set = new HashSet<int>(myArray);
int[] index = Enumerable.Range(myArray.Length).Where(i => set.Contains(myArray[i + 1])).ToArray();
index
数组将具有较低数量的索引。
答案 2 :(得分:1)
您可以使用LINQ执行此操作:
var numbers = new[]
{
1,
50,
2,
100,
102,
800
};
var treshold = 2;
var numWithIndexes = numbers.Select((value, index) => new { value, index });
var pairs = from num1 in numWithIndexes
from num2 in numWithIndexes
where (num2.value - num1.value <= treshold) && (num2.value - num1.value > 0)
select new[]
{
num1.value, // first number in the pair
num2.value, // second number in the pair
num1.index, // index of the first number in the pair
num2.index // index of the second member in the pair
};
foreach (var pair in pairs)
{
Console.WriteLine("Pair found: " + pair[0] + ", " + pair[1] +
" at line " + pair[2] + ", " + pair[3]);
}
答案 3 :(得分:1)
通过排序然后使用简单的循环轻松解决:
FindPairs(sequence: new[] { 1, 50, 2, 100, 101, 800 }, threshold: 2); // {1, 2}, {100, 101}.
private List<int[]> FindPairs(IEnumerable<int> sequence, int threshold)
{
var sorted = sequence.OrderBy(x => x).ToList();
var pairs = new List<int[]>();
for (var i = 0; i < sorted.Count - 1; ++i)
{
if (sorted[i + 1] - sorted[i] <= threshold)
{
pairs.Add(new [] { sorted[i], sorted[i + 1] });
}
}
return pairs;
}