找到一组数字中每个最大数字的最有效方法

时间:2017-03-21 06:30:47

标签: c# max

我有3个int值:

6
1
2 5
2 7
2 9
1
1

3个bool值:

int value1;
int value2;
int value3;

输入值必须是单独的变量。

bool maxIs1; bool maxIs2; bool maxIs3; 表示maxIs1 = True必须具有最大值,依此类推。

我需要方法将这组数字与一组条件进行比较。 例如:

value1

或者:

int value1 = 10;
int value2 = 1;
int value3 = 10;

bool maxIs1 = True;
bool maxIs2 = False;
bool maxIs3 = True;

bool result = compareValues(); //true

最有效的方法是什么?

3 个答案:

答案 0 :(得分:2)

这很有趣。如果你可以把它们放到一个数组中,你可以使用linq干净地检查它们是否满足条件:

var values = new[] { value1, value2, value3 };
var maxes = new[] { maxIs1, maxIs2, maxIs3 };
var max = values.Max();

var result = values
    .Zip(maxes, (f, s) => new { value = f, isMax = s })
    .All(c => !c.isMax || (c.value == max));

答案 1 :(得分:1)

我认为你不必关心3值的效率

int value1 = 10;
int value2 = 1;
int value3 = 1;

bool maxIs1 = true;
bool maxIs2 = false;
bool maxIs3 = true;

int max = new[] { value1, value2, value3 }.Max();
bool result = (!maxIs1 || value1 == max) && (!maxIs2 || value2 == max) && (!maxIs3 || value3 == max);

答案 2 :(得分:0)

如果您想要不同数量的值,请尝试此解决方案:

static void Main()
    {
        List<int> listOfInts = new List<int>();
        List<bool> listOfBools = new List<bool>();

        listOfInts.Add(1);
        listOfInts.Add(2);
        listOfInts.Add(1);

        listOfBools.Add(false);
        listOfBools.Add(false);
        listOfBools.Add(false);

        Console.WriteLine("value = " + Compare(listOfInts,listOfBools));

    }

Compare()应该是这样的:

static bool Compare(List<int> listOfInts, List<bool> listOfBools)
    {
        int max = listOfInts.Max();
        bool isCorrect = true;

        var maxList = listOfInts.Where(value => value == max);
        var indicesOfMax = GetIndeciesOfMax(maxList, listOfInts);

        for (int i = 0; i < listOfInts.Count; i++)
        {
            if (indicesOfMax.Contains(i) && listOfInts[i] == max && listOfBools[i])
            {
                isCorrect = true;
            }
            else if (!indicesOfMax.Contains(i) && listOfInts[i] != max && !listOfBools[i])
            {
                isCorrect = true;
            }
            else
            {
                isCorrect = false;
                break;
            }
        }

        return isCorrect;
    }

    static List<int> GetIndeciesOfMax(IEnumerable<int> maxList, List<int> list)
    {
        List<int> indecies = new List<int>();

        foreach (var m in maxList)
        {
            indecies.Add(list.IndexOf(m));
        }

        return indecies;
    }