单独的功能,无需重复代码

时间:2013-10-06 19:30:35

标签: c# .net

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

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);
    }
}

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

首先 - 我会使用foreach代替while,关于重复的代码(假设你没有使用Linq) - 我认为没关系

了解Linq如何简化您的代码:

var FindSum = store.Sum();
var FindValue = store.FindAll(x => x == 40);

答案 2 :(得分: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。你显然是编程新手,你应该先学习基础知识。