1

我目前正在开发一个程序来遍历具有两个不同函数的数字列表以找到总和和特定值。这是我实现的代码

class Program
{
    static int i, sum;
    static List<int> store = new List<int>();

    static void Main(string[] args)
    {


        for (i = 0; i < 100; i++)
        {
            store.Add(i);
        }

        i = 0;
        TraverseList();
        Console.ReadLine();
    }

    static void TraverseList()
    {
        while (i < store.Count)
        {
            FindValue();
            FindSum();
            i++;
        }

        Console.WriteLine("The sum is {0}", sum);
    }

    static void FindValue()
    {           
        if (store[i] == 40)
        {
            Console.WriteLine("Value is 40");
        }                
    }

    static void FindSum()
    {
        sum = sum + store[i];
    }
}

我正在考虑将 FindSum 和 FindValue 分成两个不同的函数,而不是在 TraverseList 中调用它们。有没有其他方法可以做到这一点,而不是像我在这里所做的那样在这两个函数中复制列表遍历的公共代码

class Program
{
    static int i, sum;
    static List<int> store = new List<int>();

    static void Main(string[] args)
    {


        for (i = 0; i < 100; i++)
        {
            store.Add(i);
        }

        i = 0;
        FindValue();
        i = 0;
        FindSum();

        Console.ReadLine();
    }

    static void FindValue()
    {
        while (i < store.Count)
        {
            if (store[i] == 40)
            {
                Console.WriteLine("Value is 40");
            }
            i++;
        }
    }

    static void FindSum()
    {
        while (i < store.Count)
        {
            sum = sum + store[i];
            i++;
        }

        Console.WriteLine("The sum is {0}", sum);
    }
}
4

3 回答 3

1

要查找一系列数字的总和,您可以使用简单的 LINQ 函数:

List<int> numbers = new List<int>();
int sum = numbers.Sum();

我不确定你所说的找到一个值是什么意思。如果要检查系列中的一个数字是否等于某个值,可以使用 LINQ 函数Any

int myValue = 40;
bool hasMyValue = numbers.Any(i => i == myValue);

这使用了一个执行函数并将集合中的每个元素传递给函数的 lambda 表达式。该函数返回 true 或 false 以指示该元素与Any测试匹配。

相反,如果您想检查序列中有多少数字与某个值匹配,则可以使用如下Count函数:

int numberOfMatches = numbers.Count(i => i == myValue);
于 2013-10-06T19:44:01.560 回答
0

第一件事-关于重复的代码,我会使用foreach而不是while,(假设您没有使用 Linq)-我认为这很好

体验一下 Linq 如何简化您的代码:

var FindSum = store.Sum();
var FindValue = store.FindAll(x => x == 40);
于 2013-10-06T19:44:09.730 回答
0

我不能足够强调拥有isum作为班级成员的糟糕程度。特别是i。它会使您的代码非常脆弱,并且难以使用。尽量使每个方法与其余代码隔离。

尝试这样的事情:

static void Main( string[] args )
{
    List<int> store = new List<int>();

    for( int i = 0; i < 100; i++ )
        store.Add( i );

    FindValue( store );
    FindSum( store );

    Console.ReadLine();
}

static void FindValue( List<int> list )
{
    for( int i = 0; i < list.Count; i++ )
    {
        if( list[i] == 40 )
            Console.WriteLine( "Value is 40" );
    }
}

static void FindSum( List<int> list )
{
    int sum = 0;
    for( int i = 0; i < list.Count; i++ )
        sum += list[i];

    Console.WriteLine( "The sum is {0}", sum );
}

复制循环非常好(并且正常),它只是一行。您也可以在此处使用 foreach。

另外,不要理会每个告诉您使用 LINQ 的人。您显然是编程新手,您应该先学习基础知识。

于 2013-10-06T20:12:31.753 回答