Cập nhật tất cả các đối tượng trong bộ sưu tập bằng LINQ


500

Có cách nào để làm như sau bằng LINQ không?

foreach (var c in collection)
{
    c.PropertyToSet = value;
}

Để làm rõ, tôi muốn lặp qua từng đối tượng trong một bộ sưu tập và sau đó cập nhật một thuộc tính trên từng đối tượng.

Trường hợp sử dụng của tôi là tôi có một loạt các bình luận trên một bài đăng trên blog và tôi muốn lặp lại qua từng bình luận trên một bài đăng trên blog và đặt thời gian trên bài đăng trên blog là +10 giờ. Tôi có thể làm điều đó bằng SQL, nhưng tôi muốn giữ nó trong lớp nghiệp vụ.


14
Câu hỏi thú vị. Cá nhân tôi thích cách bạn đã có nó ở trên - rõ ràng hơn những gì đang diễn ra!
noelicus

8
Tôi đến đây để tìm câu trả lời cho cùng một câu hỏi và quyết định rằng nó dễ như vậy, ít mã hơn và dễ hiểu hơn cho các nhà phát triển trong tương lai chỉ làm theo cách bạn đã làm trong OP.
Casey Crookston

4
Tại sao bạn muốn làm điều đó trong LINQ?
Caltor

13
Câu hỏi này yêu cầu điều sai, câu trả lời đúng duy nhất là: không sử dụng LINQ để sửa đổi nguồn dữ liệu
Tim Schmelter

Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì hầu hết tất cả các câu trả lời cho câu hỏi này đều có hại cho sự hiểu biết của các lập trình viên mới về LINQ.
Tanveer Badar

Câu trả lời:


842

Mặc dù bạn có thể sử dụng ForEachphương thức tiện ích mở rộng, nhưng nếu bạn chỉ muốn sử dụng khung bạn có thể làm

collection.Select(c => {c.PropertyToSet = value; return c;}).ToList();

Điều ToListnày là cần thiết để đánh giá lựa chọn ngay lập tức do đánh giá lười biếng .


6
Tôi ủng hộ điều này bởi vì đây là một giải pháp khá hay ... lý do duy nhất tôi thích phương pháp mở rộng là nó làm cho nó rõ ràng hơn một chút để hiểu chính xác những gì đang diễn ra ... tuy nhiên giải pháp của bạn vẫn khá ngọt ngào
lomaxx

9
Nếu bộ sưu tập là một ObservableCollectiontiếng nói, thì việc thay đổi các mục tại chỗ thay vì tạo một danh sách mới có thể hữu ích.
Cameron MacFarland

7
@desaivv yeah đây là một chút lạm dụng cú pháp, vì vậy Resharper đang cảnh báo bạn về điều này.
Cameron MacFarland

46
IMHO, điều này ít biểu cảm hơn nhiều so với một vòng lặp foreach đơn giản. ToList () gây nhầm lẫn bởi vì nó không được sử dụng cho bất cứ điều gì ngoài việc buộc đánh giá sẽ bị hoãn lại. Phép chiếu cũng khó hiểu vì nó không được sử dụng cho mục đích của nó; thay vào đó, nó được sử dụng để lặp lại các yếu tố của bộ sưu tập và cho phép truy cập vào một thuộc tính để có thể cập nhật. Câu hỏi duy nhất trong đầu tôi là liệu vòng lặp foreach có thể hưởng lợi từ việc song song sử dụng Parallel.ForEach hay không, nhưng đó là một câu hỏi khác.
Philippe

37
Câu trả lời này là một thực tế tồi tệ nhất. Không bao giờ làm điều này.
Eric Lippert

351
collection.ToList().ForEach(c => c.PropertyToSet = value);

36
@SanthoshKumar: Sử dụngcollection.ToList().ForEach(c => { c.Property1ToSet = value1; c.Property2ToSet = value2; });
Ε

@CameronMacFarland: Tất nhiên là không vì cấu trúc là bất biến. Nhưng nếu bạn thực sự muốn, bạn có thể làm điều này:collection.ToList().ForEach(c => { collection[collection.IndexOf(c)] = new <struct type>() { <propertyToSet> = value, <propertyToRetain> = c.Property2Retain }; });
Ε é И

11
Điều này có lợi thế hơn câu trả lời của Cameron MacFarland về việc cập nhật danh sách tại chỗ, thay vì tạo một danh sách mới.
Simon Tewsi

7
Wow, câu trả lời này thực sự không hữu ích. Tạo một bộ sưu tập mới chỉ để có thể sử dụng một vòng lặp
Tim Schmelter

@SimonTewsi Vì nó là một tập hợp các đối tượng, nên dù sao thì danh sách này cũng phải được cập nhật. Bộ sưu tập sẽ là mới, nhưng các đối tượng trong bộ sưu tập sẽ giống nhau.
Chris

70

Tôi đang làm việc này

Collection.All(c => { c.needsChange = value; return true; });

Tôi nghĩ rằng đây là cách sạch nhất để làm điều đó.
wcm

31
Cách tiếp cận này chắc chắn hoạt động nhưng nó vi phạm mục đích của All()phương thức mở rộng, dẫn đến sự nhầm lẫn tiềm ẩn khi người khác đọc mã.
Tom Baxter

Cách tiếp cận này tốt hơn. Sử dụng tất cả thay vì sử dụng mỗi vòng lặp
UJS

2
Chắc chắn thích điều này hơn là gọi ToList () một cách không cần thiết, ngay cả khi nó hơi sai lệch về việc sử dụng All () để làm gì.
iupchris10

1
Nếu bạn đang sử dụng một bộ sưu tập như List<>vậy thì ForEach()phương pháp đó là một cách ít khó hiểu hơn để thực hiện điều này. exForEach(c => { c.needsChange = value; })
Dan Fiddling By Firelight

27

Tôi thực sự tìm thấy một phương thức mở rộng sẽ làm những gì tôi muốn độc đáo

public static IEnumerable<T> ForEach<T>(
    this IEnumerable<T> source,
    Action<T> act)
{
    foreach (T element in source) act(element);
    return source;
}

4
tốt đẹp :) Lomaxx, có thể thêm một ví dụ để peeps có thể thấy nó trong 'hành động' (boom tish!).
Pure.Krom

2
Đây là cách tiếp cận hữu ích duy nhất nếu bạn thực sự muốn tránh một foreach-loop (vì bất kỳ lý do gì).
Tim Schmelter

@Rango mà bạn vẫn KHÔNG tránh foreachvì bản thân mã chứa foreachvòng lặp
GoldBishop

@GoldBishop chắc chắn, phương thức ẩn vòng lặp.
Tim Schmelter

1
Liên kết bị hỏng, hiện có sẵn tại: codewrecks.com/blog/index.php/2008/08/13/ . Ngoài ra còn có một bình luận blog liên kết đến stackoverflow.com/questions/200574 . Đổi lại, các câu hỏi bình luận hàng đầu liên kết đến blog.msdn.microsoft.com/ericlippert/2009/05/18/ . Có lẽ câu trả lời sẽ được viết lại đơn giản hơn bằng MSDN (bạn vẫn có thể ghi có liên kết đầu tiên nếu bạn muốn). Sidenote: Rust có các tính năng tương tự, và cuối cùng đã đưa vào và thêm chức năng tương đương: stackoverflow.com/a/50224248/799204
sourcejedi

15

Sử dụng:

ListOfStuff.Where(w => w.Thing == value).ToList().ForEach(f => f.OtherThing = vauleForNewOtherThing);

Tôi không chắc liệu điều này có quá lạm dụng LINQ hay không, nhưng nó đã hoạt động với tôi khi muốn cập nhật một mục cụ thể trong danh sách cho một điều kiện cụ thể.


7

Không có phương pháp mở rộng tích hợp để làm điều này. Mặc dù xác định một là khá thẳng về phía trước. Ở dưới cùng của bài viết là một phương pháp tôi xác định được gọi là Iterate. Nó có thể được sử dụng như vậy

collection.Iterate(c => { c.PropertyToSet = value;} );

Nguồn lặp

public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T> callback)
{
    if (enumerable == null)
    {
        throw new ArgumentNullException("enumerable");
    }

    IterateHelper(enumerable, (x, i) => callback(x));
}

public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
    if (enumerable == null)
    {
        throw new ArgumentNullException("enumerable");
    }

    IterateHelper(enumerable, callback);
}

private static void IterateHelper<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
    int count = 0;
    foreach (var cur in enumerable)
    {
        callback(cur, count);
        count++;
    }
}

Là lặp lại cần thiết, có gì sai với Count, Sum, Average hoặc phương thức mở rộng hiện có khác trả về giá trị vô hướng?
AnthonyWJones

2
Điều này khá gần với những gì tôi muốn nhưng một chút .. tham gia. Bài đăng blog tôi đã đăng có một triển khai tương tự nhưng với ít dòng mã hơn.
lomaxx

1
IterateHelper dường như quá mức cần thiết. Quá tải mà không mất một chỉ mục sẽ kết thúc việc làm thêm rất nhiều (chuyển đổi cuộc gọi lại thành lambda lấy chỉ mục, giữ một số lượng không bao giờ được sử dụng). Tôi hiểu rằng nó được sử dụng lại, nhưng dù sao thì nó cũng chỉ là một cách giải quyết cho việc sử dụng forloop vì vậy nó sẽ hiệu quả.
Cameron MacFarland

2
@Cameron, IterateHelper phục vụ 2 mục đích. 1) Thực hiện đơn lẻ và 2) cho phép ném ArgumentNullException vào thời gian cuộc gọi so với sử dụng. Các trình lặp C # bị trì hoãn thực thi, có trình trợ giúp ngăn chặn hành vi kỳ lạ của một ngoại lệ bị ném trong quá trình lặp.
JaredPar

2
@JaredPar: Ngoại trừ bạn không sử dụng trình lặp. Không có tuyên bố năng suất.
Cameron MacFarland

7

Mặc dù bạn đặc biệt yêu cầu một giải pháp LINQ và câu hỏi này khá cũ nhưng tôi đăng một giải pháp không phải LINQ. Điều này là do LINQ (= truy vấn tích hợp ngôn ngữ ) có nghĩa là được sử dụng cho các truy vấn trên các bộ sưu tập. Tất cả các phương thức LINQ không sửa đổi bộ sưu tập cơ bản, chúng chỉ trả về một bộ mới (hoặc chính xác hơn là một bộ lặp cho bộ sưu tập mới). Do đó, bất cứ điều gì bạn làm, ví dụ như Selectkhông ảnh hưởng đến bộ sưu tập cơ bản, bạn chỉ cần lấy một cái mới.

Tất nhiên rồi có thể làm điều đó với một ForEach(không phải là LINQ, nhân tiện, nhưng là một phần mở rộng trên List<T>). Nhưng điều này theo nghĩa đen sử dụng foreachdù sao, nhưng với một biểu thức lambda. Ngoài ra, mọi phương thức LINQ đều lặp đi lặp lại bộ sưu tập của bạn, ví dụ như bằng cách sử dụng foreachhoặcfor , tuy nhiên, nó chỉ đơn giản là ẩn nó khỏi máy khách. Tôi không xem xét điều này nữa có thể đọc được hoặc duy trì hơn (nghĩ về việc chỉnh sửa mã của bạn trong khi gỡ lỗi một phương thức có chứa biểu thức lambda).

Đã nói điều này không nên sử dụng LINQ để sửa đổi các mục trong bộ sưu tập của bạn. Một cách tốt hơn là giải pháp bạn đã cung cấp trong câu hỏi của bạn. Với một vòng lặp cổ điển, bạn có thể dễ dàng lặp lại bộ sưu tập của mình và cập nhật các mục của nó. Trong thực tế tất cả những giải pháp dựa vàoList.ForEach không có gì khác nhau, nhưng khó đọc hơn từ quan điểm của tôi.

Vì vậy, bạn không nên sử dụng LINQ trong những trường hợp bạn muốn cập nhật các yếu tố trong bộ sưu tập của mình.


3
Ngoài chủ đề: Tôi đồng ý và có rất nhiều trường hợp LINQ bị lạm dụng, ví dụ về những người yêu cầu "chuỗi LINQ hiệu suất cao", để làm những gì có thể được thực hiện với một vòng lặp, v.v ... Tôi rất biết ơn rằng KHÔNG sử dụng LINQ là quá ăn sâu vào tôi và thường không sử dụng nó. Tôi thấy mọi người sử dụng chuỗi LINQ để thực hiện một hành động duy nhất, không nhận ra điều đó khá nhiều mỗi khi sử dụng lệnh LINQ, bạn đang tạo một forvòng lặp khác "dưới mui xe". Tôi cảm thấy đó là đường tổng hợp để tạo ra các cách thức ít phức tạp hơn để thực hiện các tác vụ đơn giản, không phải là sự thay thế cho mã hóa tiêu chuẩn.
ForeverZer0

6

Tôi đã thử một vài biến thể về điều này và tôi tiếp tục quay lại giải pháp của anh chàng này.

http://www.hookedonlinq.com/UpdateOperator.ashx

Một lần nữa, đây là giải pháp của người khác. Nhưng tôi đã biên dịch mã vào một thư viện nhỏ và sử dụng nó khá thường xuyên.

Tôi sẽ dán mã của anh ấy vào đây, vì rất có thể trang web của anh ấy (blog) sẽ không còn tồn tại vào một thời điểm nào đó trong tương lai. (Không có gì tệ hơn là nhìn thấy một bài đăng có nội dung "Đây là câu trả lời chính xác mà bạn cần", Nhấp vào và URL chết.)

    public static class UpdateExtensions {

    public delegate void Func<TArg0>(TArg0 element);

    /// <summary>
    /// Executes an Update statement block on all elements in an IEnumerable<T> sequence.
    /// </summary>
    /// <typeparam name="TSource">The source element type.</typeparam>
    /// <param name="source">The source sequence.</param>
    /// <param name="update">The update statement to execute for each element.</param>
    /// <returns>The numer of records affected.</returns>
    public static int Update<TSource>(this IEnumerable<TSource> source, Func<TSource> update)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (update == null) throw new ArgumentNullException("update");
        if (typeof(TSource).IsValueType)
            throw new NotSupportedException("value type elements are not supported by update.");

        int count = 0;
        foreach (TSource element in source)
        {
            update(element);
            count++;
        }
        return count;
    }
}



int count = drawingObjects
        .Where(d => d.IsSelected && d.Color == Colors.Blue)
        .Update(e => { e.Color = Color.Red; e.Selected = false; } );

1
Bạn có thể sử dụng Action<TSource>thay vì tạo một đại biểu phụ. Điều đó có thể không có sẵn tại thời điểm viết bài đó, mặc dù.
Frank J

Vâng, đó là DotNet trường học cũ tại thời điểm đó. Nhận xét tốt Frank.
granadaCoder

URL đã chết! (Tên miền này đã hết hạn) Điều tốt là tôi đã sao chép mã ở đây! #patOnShoulder
granadaCoder

1
Kiểm tra loại giá trị có ý nghĩa, nhưng có lẽ sẽ tốt hơn nếu sử dụng một ràng buộc, nghĩa là where T: struct, để nắm bắt điều này vào thời gian biên dịch.
Groo


3

Tôi đã viết một số phương pháp mở rộng để giúp tôi với điều đó.

namespace System.Linq
{
    /// <summary>
    /// Class to hold extension methods to Linq.
    /// </summary>
    public static class LinqExtensions
    {
        /// <summary>
        /// Changes all elements of IEnumerable by the change function
        /// </summary>
        /// <param name="enumerable">The enumerable where you want to change stuff</param>
        /// <param name="change">The way you want to change the stuff</param>
        /// <returns>An IEnumerable with all changes applied</returns>
        public static IEnumerable<T> Change<T>(this IEnumerable<T> enumerable, Func<T, T> change  )
        {
            ArgumentCheck.IsNullorWhiteSpace(enumerable, "enumerable");
            ArgumentCheck.IsNullorWhiteSpace(change, "change");

            foreach (var item in enumerable)
            {
                yield return change(item);
            }
        }

        /// <summary>
        /// Changes all elements of IEnumerable by the change function, that fullfill the where function
        /// </summary>
        /// <param name="enumerable">The enumerable where you want to change stuff</param>
        /// <param name="change">The way you want to change the stuff</param>
        /// <param name="where">The function to check where changes should be made</param>
        /// <returns>
        /// An IEnumerable with all changes applied
        /// </returns>
        public static IEnumerable<T> ChangeWhere<T>(this IEnumerable<T> enumerable, 
                                                    Func<T, T> change,
                                                    Func<T, bool> @where)
        {
            ArgumentCheck.IsNullorWhiteSpace(enumerable, "enumerable");
            ArgumentCheck.IsNullorWhiteSpace(change, "change");
            ArgumentCheck.IsNullorWhiteSpace(@where, "where");

            foreach (var item in enumerable)
            {
                if (@where(item))
                {
                    yield return change(item);
                }
                else
                {
                    yield return item;
                }
            }
        }

        /// <summary>
        /// Changes all elements of IEnumerable by the change function that do not fullfill the except function
        /// </summary>
        /// <param name="enumerable">The enumerable where you want to change stuff</param>
        /// <param name="change">The way you want to change the stuff</param>
        /// <param name="where">The function to check where changes should not be made</param>
        /// <returns>
        /// An IEnumerable with all changes applied
        /// </returns>
        public static IEnumerable<T> ChangeExcept<T>(this IEnumerable<T> enumerable,
                                                     Func<T, T> change,
                                                     Func<T, bool> @where)
        {
            ArgumentCheck.IsNullorWhiteSpace(enumerable, "enumerable");
            ArgumentCheck.IsNullorWhiteSpace(change, "change");
            ArgumentCheck.IsNullorWhiteSpace(@where, "where");

            foreach (var item in enumerable)
            {
                if (!@where(item))
                {
                    yield return change(item);
                }
                else
                {
                    yield return item;
                }
            }
        }

        /// <summary>
        /// Update all elements of IEnumerable by the update function (only works with reference types)
        /// </summary>
        /// <param name="enumerable">The enumerable where you want to change stuff</param>
        /// <param name="update">The way you want to change the stuff</param>
        /// <returns>
        /// The same enumerable you passed in
        /// </returns>
        public static IEnumerable<T> Update<T>(this IEnumerable<T> enumerable,
                                               Action<T> update) where T : class
        {
            ArgumentCheck.IsNullorWhiteSpace(enumerable, "enumerable");
            ArgumentCheck.IsNullorWhiteSpace(update, "update");
            foreach (var item in enumerable)
            {
                update(item);
            }
            return enumerable;
        }

        /// <summary>
        /// Update all elements of IEnumerable by the update function (only works with reference types)
        /// where the where function returns true
        /// </summary>
        /// <param name="enumerable">The enumerable where you want to change stuff</param>
        /// <param name="update">The way you want to change the stuff</param>
        /// <param name="where">The function to check where updates should be made</param>
        /// <returns>
        /// The same enumerable you passed in
        /// </returns>
        public static IEnumerable<T> UpdateWhere<T>(this IEnumerable<T> enumerable,
                                               Action<T> update, Func<T, bool> where) where T : class
        {
            ArgumentCheck.IsNullorWhiteSpace(enumerable, "enumerable");
            ArgumentCheck.IsNullorWhiteSpace(update, "update");
            foreach (var item in enumerable)
            {
                if (where(item))
                {
                    update(item);
                }
            }
            return enumerable;
        }

        /// <summary>
        /// Update all elements of IEnumerable by the update function (only works with reference types)
        /// Except the elements from the where function
        /// </summary>
        /// <param name="enumerable">The enumerable where you want to change stuff</param>
        /// <param name="update">The way you want to change the stuff</param>
        /// <param name="where">The function to check where changes should not be made</param>
        /// <returns>
        /// The same enumerable you passed in
        /// </returns>
        public static IEnumerable<T> UpdateExcept<T>(this IEnumerable<T> enumerable,
                                               Action<T> update, Func<T, bool> where) where T : class
        {
            ArgumentCheck.IsNullorWhiteSpace(enumerable, "enumerable");
            ArgumentCheck.IsNullorWhiteSpace(update, "update");

            foreach (var item in enumerable)
            {
                if (!where(item))
                {
                    update(item);
                }
            }
            return enumerable;
        }
    }
}

Tôi đang sử dụng nó như thế này:

        List<int> exampleList = new List<int>()
            {
                1, 2 , 3
            };

        //2 , 3 , 4
        var updated1 = exampleList.Change(x => x + 1);

        //10, 2, 3
        var updated2 = exampleList
            .ChangeWhere(   changeItem => changeItem * 10,          // change you want to make
                            conditionItem => conditionItem < 2);    // where you want to make the change

        //1, 0, 0
        var updated3 = exampleList
            .ChangeExcept(changeItem => 0,                          //Change elements to 0
                          conditionItem => conditionItem == 1);     //everywhere but where element is 1

Để tham khảo kiểm tra đối số:

/// <summary>
/// Class for doing argument checks
/// </summary>
public static class ArgumentCheck
{


    /// <summary>
    /// Checks if a value is string or any other object if it is string
    /// it checks for nullorwhitespace otherwhise it checks for null only
    /// </summary>
    /// <typeparam name="T">Type of the item you want to check</typeparam>
    /// <param name="item">The item you want to check</param>
    /// <param name="nameOfTheArgument">Name of the argument</param>
    public static void IsNullorWhiteSpace<T>(T item, string nameOfTheArgument = "")
    {

        Type type = typeof(T);
        if (type == typeof(string) ||
            type == typeof(String))
        {
            if (string.IsNullOrWhiteSpace(item as string))
            {
                throw new ArgumentException(nameOfTheArgument + " is null or Whitespace");
            }
        }
        else
        {
            if (item == null)
            {
                throw new ArgumentException(nameOfTheArgument + " is null");
            }
        }

    }
}

2

2 đồng xu của tôi: -

 collection.Count(v => (v.PropertyToUpdate = newValue) == null);

7
Tôi thích suy nghĩ, nhưng nó không thực sự rõ ràng những gì mã đang làm
lomaxx

2

Bạn có thể sử dụng LINQ để chuyển đổi bộ sưu tập của mình thành một mảng và sau đó gọi Array.ForEach ():

Array.ForEach(MyCollection.ToArray(), item=>item.DoSomeStuff());

Rõ ràng điều này sẽ không hoạt động với các bộ sưu tập các cấu trúc hoặc các kiểu sẵn có như số nguyên hoặc chuỗi.


1

Đây là phương pháp mở rộng tôi sử dụng ...

    /// <summary>
    /// Executes an Update statement block on all elements in an  IEnumerable of T
    /// sequence.
    /// </summary>
    /// <typeparam name="TSource">The source element type.</typeparam>
    /// <param name="source">The source sequence.</param>
    /// <param name="action">The action method to execute for each element.</param>
    /// <returns>The number of records affected.</returns>
    public static int Update<TSource>(this IEnumerable<TSource> source, Func<TSource> action)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (action == null) throw new ArgumentNullException("action");
        if (typeof (TSource).IsValueType)
            throw new NotSupportedException("value type elements are not supported by update.");

        var count = 0;
        foreach (var element in source)
        {
            action(element);
            count++;
        }
        return count;
    }

Tại sao "các phần tử loại giá trị không được hỗ trợ bởi cập nhật" ?? Không có gì can thiệp điều đó!
abatishchev

Đó là cụ thể cho dự án tôi đang làm việc. Tôi cho rằng nó sẽ không quan trọng trong hầu hết các trường hợp. Gần đây tôi đã làm lại điều đó và đổi tên nó thành Chạy (...), loại bỏ điều loại giá trị và thay đổi nó để trả về khoảng trống và bỏ mã đếm.
Bill Forney

Điều đó ít nhiều List<T>.ForEachcũng làm những gì , nhưng chỉ cho tất cả IEnumerable.
HimBromBeere

Bây giờ nhìn lại điều này tôi muốn nói chỉ cần sử dụng vòng lặp foreach. Lợi ích duy nhất của việc sử dụng một cái gì đó như thế này là nếu bạn muốn xâu chuỗi các phương thức lại với nhau và trả lại vô số từ hàm để tiếp tục chuỗi sau khi thực hiện hành động. Nếu không, đây chỉ là một cuộc gọi phương thức bổ sung không có lợi ích.
Bill Forney

0

Tôi giả sử bạn muốn thay đổi giá trị bên trong một truy vấn để bạn có thể viết hàm cho nó

void DoStuff()
{
    Func<string, Foo, bool> test = (y, x) => { x.Bar = y; return true; };
    List<Foo> mylist = new List<Foo>();
    var v = from x in mylist
            where test("value", x)
            select x;
}

class Foo
{
    string Bar { get; set; }
}

Nhưng không shure nếu đây là những gì bạn có ý nghĩa.


Điều này sẽ đi đúng hướng bởi sẽ yêu cầu một cái gì đó để liệt kê v, nếu không nó sẽ không làm gì cả.
AnthonyWJones

0

Bạn có thể sử dụng Magiq , một khung hoạt động hàng loạt cho LINQ.


-3

Giả sử chúng ta có dữ liệu như dưới đây,

var items = new List<string>({"123", "456", "789"});
// Like 123 value get updated to 123ABC ..

và nếu chúng ta muốn sửa đổi danh sách và thay thế các giá trị hiện có của danh sách thành các giá trị được sửa đổi, trước tiên hãy tạo một danh sách trống mới, sau đó lặp qua danh sách dữ liệu bằng cách gọi phương thức sửa đổi trên mỗi mục danh sách,

var modifiedItemsList = new List<string>();

items.ForEach(i => {
  var modifiedValue = ModifyingMethod(i);
  modifiedItemsList.Add(items.AsEnumerable().Where(w => w == i).Select(x => modifiedValue).ToList().FirstOrDefault()?.ToString()) 
});
// assign back the modified list
items = modifiedItemsList;

2
Tại sao bạn làm một cái gì đó có thể chạy trong thời gian chạy O (n) thực thi trong O (n ^ 2) hoặc tệ hơn? IM không biết làm thế nào cụ thể của linq hoạt động nhưng tôi có thể thấy đây là giải pháp tối thiểu ^ 2 cho một vấn đề n .
Fallenreaper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.