![](/img/trans.png)
[英]How to run a LINQ query on a collection of objects and a collection inside of each object
[英]Using Linq to run a method on a collection of objects?
這是一個很長的鏡頭,我知道......
假設我有一個收藏品
List<MyClass> objects;
我想在集合中的每個對象上運行相同的方法,有或沒有返回值。 在Linq之前我會說:
List<ReturnType> results = new List<ReturnType>();
List<int> FormulaResults = new List<int>();
foreach (MyClass obj in objects) {
results.Add(obj.MyMethod());
FormulaResults.Add(ApplyFormula(obj));
}
我希望能夠做這樣的事情:
List<ReturnType> results = new List<ReturnType>();
results.AddRange(objects.Execute(obj => obj.MyMethod()));
// obviously .Execute() above is fictitious
List<int> FormulaResults = new List<int>();
FormulaResults.AddRange(objects.Execute(obj => ApplyFormula(obj)));
我還沒有找到任何可以做到這一點的東西。 有這樣的事嗎?
如果沒有像我上面提到的那樣通用,那么至少可能有一種方法可以用於我現在正在處理的目的:我有一個包含一個包裝類的對象的集合:
class WrapperClass {
private WrappedClass wrapped;
public WrapperClass(WrappedClass wc) {
this.wrapped = wc;
}
}
我的代碼有一個集合List<WrappedClass> objects
,我想將其轉換為List<WrapperClass>
。 是否有一些聰明的Linq這樣做的方式,沒有做單調乏味
List<WrapperClass> result = new List<WrapperClass>();
foreach (WrappedClass obj in objects)
results.Add(new WrapperClass(obj));
謝謝...
將:
results.AddRange(objects.Select(obj => ApplyFormula(obj)));
做?
或(更簡單)
var results = objects.Select(obj => ApplyFormula(obj)).ToList();
我認為Select()擴展方法可以做你想要的:
objects.Select( obj => obj.MyMethod() ).ToList(); // produces List<Result>
objects.Select( obj => ApplyFormula(obj) ).ToList(); // produces List<int>
最后一種情況也是如此:
objects.Select( obj => new WrapperClass( obj ) ).ToList();
如果你有一個你想要調用的void
方法,這里有一個技巧,你可以使用IEnumerable,它沒有ForEach()擴展,來創建一個類似的行為,而不需要很多努力。
objects.Select( obj => { obj.SomeVoidMethod(); false; } ).Count();
在對象序列中的每個[obj]
上調用SomeVoidMethod()
之后, Select()
將生成一系列[false]
值。 由於Select()
使用延遲執行,因此我們調用Count()
擴展來強制計算序列中的每個元素。 當你想要像ForEach()
行為這樣的東西時,它可以很好地工作。
如果要應用的方法MyMethod
返回類型為T
的對象,則可以通過以下方法獲取方法結果的IEnumerable<T>
:
var results = objects.Select(o => o.MyMethod());
如果要應用的方法MyMethod
返回類型為void
則可以通過以下方法應用該方法:
objects.ForEach(o => o.MyMethod());
這假定objects
具有通用類型List<>
。 如果您擁有的只是一個IEnumerable<>
那么您可以滾動自己的 ForEach
擴展方法或首先應用objects.ToList()
並使用上面的語法。
C#編譯器將LINQ選擇映射到.select擴展方法,該方法通過IEnumerable(或我們將在此忽略的IQueryable)定義。 實際上,.Select方法正是你所追求的那種投影函數。
LBushkin是正確的,但你實際上也可以使用LINQ語法......
var query = from o in objects
select o.MyMethod();
您還可以使用奇妙的Jon Skeet的morelinq庫運行自定義方法
例如,如果您的MyClass上有一個text屬性,則需要在運行時使用同一類上的方法進行更改:
objects = objects.Pipe<MyClass>(class => class.Text = class.UpdateText()).ToList();
現在,將在列表中的每個對象上實現此方法。 我喜歡morelinq!
http://www.hookedonlinq.com/UpdateOperator.ashx有一個可以使用的擴展Update方法。 或者您可以使用其他人發布的select語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.