簡體   English   中英

使用Linq在對象集合上運行方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM