LINQ选择新对象,在函数中设置对象的值

时间:2012-08-03 09:34:46

标签: c# linq list

我正在使用LINQ在这些对象的twoWords中选择一个新的List对象,并通过调用函数/方法来设置值。

请看看这是否合理,我已经简化了很多。我真的想使用linq语句from select

GOGO中的第一个函数将起作用,第二个函数失败(尽管它们不执行相同的任务)

// simple class containing two strings, and a function to set the values
public class twoWords
{
    public string word1 { get; set; }
    public string word2 { get; set; }

    public void setvalues(string words)
    {
        word1 = words.Substring(0,4);
        word2 = words.Substring(5,4);
    }
}

public class GOGO
{

    public void ofCourseThisWillWorks()
    {
        //this is just to show that the setvalues function is working
        twoWords twoWords = new twoWords();
        twoWords.setvalues("word1 word2");
        //tada. object twoWords is populated
    }

    public void thisdoesntwork()
    {
        //set up the test data to work with
        List<string> stringlist =  new List<string>();
        stringlist.Add("word1 word2");
        stringlist.Add("word3 word4");
        //end setting up

        //we want a list of class twoWords, contain two strings : 
        //word1 and word2. but i do not know how to call the setvalues function.
        List<twoWords> twoWords = (from words in stringlist 
                            select new twoWords().setvalues(words)).ToList();
    }
}

GOGO的第二个功能会导致错误:

  

select子句中表达式的类型不正确。调用“选择”时类型推断失败。

我的问题是,在使用twoWords函数设置值时,如何在上面的from子句中选择新的setvalues对象?

1 个答案:

答案 0 :(得分:20)

您需要使用语句lambda,这意味着不使用查询表达式。在这种情况下,我不会使用查询表达式,因为你只有一个选择...

List<twoWords> twoWords = stringlist.Select(words => {
                                                var ret = new twoWords();
                                                ret.setvalues(words);
                                                return ret;
                                            })
                                    .ToList();

或者,只需要一个返回适当的twoWords

的方法
private static twoWords CreateTwoWords(string words)
{
    var ret = new twoWords();
    ret.setvalues(words);
    return ret;
}

List<twoWords> twoWords = stringlist.Select(CreateTwoWords)
                                    .ToList();

如果你真的想:

,这也可以让你使用查询表达式
List<twoWords> twoWords = (from words in stringlist 
                           select CreateTwoWords(words)).ToList();

当然另一个选择是给twoWords一个构造函数,它做了正确的事情,这时你不需要调用一个方法......