2013-05-14 52 views
0

什麼是實現由此產生相同結果的替代方法:什麼是另類的方式獲得兩個屬性的值列表

myCollection.Select(item => item.FirstValue) 
    .Concat(myCollection.Select(item => item.SecondValue)).ToList(); 

的方案是在myClass的Collection<MyClass>命名myCollection含實例(見下面)。我想爲myCollection中的每個項目創建一個List<int>實例,其中包含MyClass.FirstValueMyClass.SecondValue

public class MyClass 
{ 
    public int FirstValue { get; set; } 
    public int SecondValue {get; set; } 
} 
+0

你不能簡單地將整數存儲爲MyClass中的列表嗎? –

+1

你似乎有一個很好的解決方案。一個可能的(雖然略有不同)是'myCollection.Select(x => new [] {x.FirstValue,x.SecondValue})。SelectMany(x => x);'請注意,這將替換值,而不是擁有一個,然後是另一個。 – dlev

+0

你已經擁有了對我來說很好的東西。你爲什麼需要替代品? – dtb

回答

2

你可以嘗試這樣的事情,一個linqy單通的解決方案:

private IEnumerable<int> Flatten(MyClass instance) 
{ 
    yield return instance.Value1 ; 
    yield return instance.Value2 ; 
} 

... 

List<int> ints = myClasses.SelectMany(x => Flatten(x)).ToList() ; 

Flatten功能必須是一個真正的方法,你可以在一個封閉免得你得到這個錯誤不能使用yield return

錯誤CS1621:產量語句不能匿名方法或lambda表達式內使用

我懷疑LINQ的解決方案是更好,更簡單,更高效,更易於理解或任何較明顯的解決方案還有:

List<int> ints = new List<int>() ; 
foreach(MyClass item in myClasses) 
{ 
    ints.Add(item.Value1) ; 
    ints.Add(item.Value2) ; 
} 

我很懷疑LINQ的解決方案會更快。如果您MyClass對象的集合可以便宜地報告其大小(例如,W/O遍歷集合),可以優化多一點通過上述預分配列表到所需的大小:

List<int> ints = new List<int>(2 * myClasses.Count) ; 
foreach(MyClass item in myClasses) 
{ 
    ints.Add(item.Value1) ; 
    ints.Add(item.Value2) ; 
} 

這會節省重新分配和複製每次列表的後備存儲必須調整大小所需的時間。

+1

我只是在閱讀Jon Skeet的答案後,看看多少linq的成本:http://stackoverflow.com/questions/333242/how-does-linq-work-behind-the-scenes,它讓我非常相信Linq不是解決這個問題的正確方法。這是有代碼的。 –

+0

@RussC:Linq似乎是當今時尚界的時尚小子,推動Linq比其他任何事都好。 Resharper是這裏的主要罪人。它總是試圖說服我,我應該讓它變成Linq表達。 Resharper應該是一個工具,我**徵求建議:相反,它有點像MS Office助手,積極地接受不需要的建議。但我離題了。 –

1

關於你最後的評論,他們是ID的,我實際上是從不同的角度來看待這個問題。

如果您事先知道在您的類定義中有兩個ID,請放入一個屬性,該屬性只返回一個Array或Type的IEnumerable。使用

你的例子:

public class MyClass 
{ 
    public int FirstValue { get; set; } 
    public int SecondValue {get; set; } 

    public int[] IDs 
    { 
     return new[] { FirstValue, SecondValue }; 
    } 
} 

然後收集ID的

List<int> allTheIds = new List<int>(); 
foreach (var mc in MyClassList) 
{ 
    allTheIds.AddRange(mc.IDs); 
} 

這可能不是完美的語法,但我不是在PC上的那一刻來測試一下吧!

但是,在我看來,這是最明智的方法,根據我的經驗,我不認爲使用Linq for Linqs是一個好主意。

這當然只是個人意見!

相關問題