皮条客我的LINQ:基于另一篇文章的学习练习

时间:2010-08-10 11:09:10

标签: c# linq coding-style lambda

我决定第一次试用LINQ来尝试解决this question

我第一次涉足LINQ精彩世界的结果看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>() 
            { 
               "fred-064528-NEEDED1", 
               "xxxx", 
               "frederic-84728957-NEEDED2", 
               "sam-028-NEEDED3", 
               "-----", 
               "another-test" 
            };

            var result =
            from s in list
            where (from c in s where c == '-' select c).Count() == 2
            select s.Substring(s.LastIndexOf("-") + 1);

            foreach (string s in result)
                Console.WriteLine(s);
            Console.WriteLine("Press Enter");
            Console.ReadLine();
        }
    }
}

我想知道如何改进上述解决这个人为设计的小例子的方法。我对是否使用了最好的验证方法,或者我如何本地化“按Enter”或类似的东西不太感兴趣;我只是想使用这个例子来学习更多关于LINQ的知识。

5 个答案:

答案 0 :(得分:6)

var result =
        from s in list
        where s.Count(x => x == '=') == 2
        select s.Substring(s.LastIndexOf("-") + 1);

答案 1 :(得分:4)

也可以使用Lambda表达式编写:

var result =
            list.Where(s => (from c in s where c == '-' select c).Count() == 2).Select(
                s => s.Substring(s.LastIndexOf("-") + 1));

由于Fluent接口,我更喜欢Lambda表达式而不是LINQ语法。恕我直言,它更具人性化。

答案 2 :(得分:4)

我觉得这很不错。部分是LINQ。

var result = String.Join("-", inputData.Split('-').Skip(2));

如果在前两个之后不能有任何' - '那么这将(不是LINQ):

var result = inputData.Split('-')[2];  //If the last part is NEE-DED then only NEE is returned. And will fail on wrong input

答案 3 :(得分:4)

我也是Lambdas的忠实粉丝......

    static void Main(string[] args)  
    {  
        Func<string, char, int> countNumberOfCharsInString = 
             (str, c) => str.Count(character => character == c);

        var list = new List<string>() 
        { "fred-064528-NEEDED1", 
           "xxxx", 
           "frederic-84728957-NEEDED2", 
           "sam-028-NEEDED3", 
           "-----", "another-test" 
        };

        list.Where(fullString => countNumberOfCharsInString(fullString,'-') == 2)
            .ToList()
            .ForEach(s => Console.WriteLine(s.Substring(s.LastIndexOf("-")+1)));

        Console.WriteLine("Press Enter");   
        Console.ReadLine();  
    } 

答案 4 :(得分:4)

我不认为这是一种改进,因为它的可读性较差,但您可以使用List类中的一些内置方法在一行中完成所有操作:

list.FindAll(s => s.ToCharArray().
    Where(c => c == '-').Count() ==2).
    ForEach(c => Console.WriteLine(c.Substring(c.LastIndexOf("-") + 1)));

就我个人而言,我觉得这很可怕,所以只是为了兴趣!