查找数组或列表

时间:2015-08-29 14:19:19

标签: c# arrays

我的目标是在数组或列表中查找数字对。在这种情况下,一对由两个条目之间的最大差异定义。例如

1
50
2
100
102
800

与行号(数组编号)的对(如果最大差异阈值为2):

1,2 line number of 1 is 0
100,101 line number of 100 is 3

我该怎么做?

4 个答案:

答案 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;
}