Kiểm tra điều kiện trên một mục trong danh sách mà không cần foreach

lập trình


Làm cách nào tôi có thể kiểm tra điều kiện trên một mục trong danh sách mà không cần sử dụng foreach. Ví dụ: thay vì phải làm:

C#
foreach(string[] item in mylist)
{
  if(Convert.ToBoolean(item[0]){}
}

Tôi chỉ có thể truy cập trực tiếp vào mục của danh sách của tôi. Làm thế nào tôi có thể đạt được điều này?

Cảm ơn!

Giải pháp 4

Đầu tiên, bạn không thể tìm được mục đầu tiên trong danh sách phù hợp với một điều kiện, hoặc, tất cả các mục trong Danh sách khớp với một số điều kiện mà không cần sự lặp lại: sử dụng Linq sẽ chỉ “tự động hóa” việc đó cho bạn.

Câu hỏi để bạn làm rõ ở đây chính xác là gì bạn muốn được trả về từ lần lặp lại danh sách các chuỗi của bạn:

1. danh sách các chỉ mục trong danh sách chứa các chuỗi có thể chuyển đổi thành giá trị bool?

2. hoặc, chỉ là một loạt các giá trị boolean trong một danh sách: không có chỉ mục, thật khó để tưởng tượng việc sử dụng nó.

3. hoặc thực hiện một số hành động (thực thi một số mã) cho mỗi chuỗi có thể được chuyển đổi thành bool dựa trên giá trị boolean và/hoặc chỉ mục của giá trị đó trong danh sách các chuỗi? imho, một trường hợp sử dụng hợp lý hơn.

4. xem nhận xét của tôi về bài đăng của bạn ở trên để biết bạn cần làm rõ điều gì khác

Ở đây tôi sẽ chỉ cho bạn một ví dụ về cách trả về danh sách các chuỗi dưới dạng một từ điển … trong đó khóa ‘ là chỉ mục của giá trị boolean trong danh sách và giá trị là giá trị boolean được chuyển đổi.

C#
// required
using System.Linq

// assume the data source here is a simple List<string>
List<string> strList = new List<string>
{
    "True", "what", "False", "True", "ozone", "False"
};

// this variable must be initialized to be used in the Linq shown here
bool booltest = false;

Dictionary<int,bool> dctIntBool = strList
.Select((str, index) => new {index, str})
.Where(pair => Boolean.TryParse(pair.str, out booltest))
.ToDictionary(pair => pair.index, pair => booltest);

Lưu ý biến thể của Linq ‘Chọn tạo/bảo tồn chỉ mục của bộ sưu tập mà nó lặp lại được sử dụng ở đây: mỗi cặp chỉ mục/giá trị được chiếu vào một cấu trúc ẩn danh mới; sau đó, câu lệnh Where Linq sẽ lọc các “cặp” đó để bất kỳ cặp nào có chuỗi không thể chuyển đổi thành ‘bool đều bị loại bỏ; cuối cùng, Linq ToDictionary được sử dụng để tạo cấu trúc Từ điển, sử dụng Giá trị của mỗi KeyValuePair giá trị boolean được gán cho ‘booltest bởi câu lệnh ‘TryParse trong mệnh đề Where.

Giải pháp 2

Nếu bạn muốn lặp lại một bộ sưu tập và không muốn sử dụng foreach vòng lặp, bạn không có nhiều lựa chọn hơn một for vòng. Bằng cách này (tôi giả sử mylist là một IList):

C#
int count = mylist.Count;
string[] result; // This assumes you have an IList<string[]>
for (int i = 0; i < count; i++)
{
   result = mylist[i];
   bool value = Convert.ToBoolean(result[0]);
}

Tôi không thể hiểu lý do tại sao bạn lại làm việc với một danh sách các mảng chuỗi để có được một boolean. Rõ ràng phải có cách triển khai tốt hơn/sạch hơn.

Hi vọng điêu nay co ich. Chúc may mắn.

Giải pháp 3

Nếu ý bạn là List<T>bạn có thể sử dụng Phương thức List.Contains[^].

C#
List<string> mylist = new List<string>(){"cat","dog","bird"};

var result = mylist.Contains("bird");
Console.WriteLine("A list {0} 'bird' word", result==true ? "contains" : "does not contain");

Giải pháp 5

Không có điều gì gọi là phép lạ. Nếu bạn sử dụng một số phương thức không có vòng lặp, điều đó có nghĩa là một số vòng lặp được sử dụng phía sau. Nhưng việc sử dụng những phương pháp như vậy thường hoàn toàn hợp lý. Xem, đặc biệt, phương pháp chung System.Array.ForEach<>:

[^].

-SA

Giải pháp 6

Bạn có thể sử dụng hàm lambda, giống như cải tiến các phương thức ẩn danh, giúp điều kiện dễ đọc hơn:

bool exists = myList.Any(x => Convert.ToBoolean(x) == true);
if (exists) {
    // Do something
}

コメント

タイトルとURLをコピーしました