我想遍歷 2 個相同長度的串列,并為這些串列的每個成員分配一個相應的變數,而不是在 for 回圈中使用索引。
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.zip?view=net-5.0
在 Microsoft 的這個檔案中,第一個應用程式有一個示例,我絕對了解如何使用它,但是,我似乎無法使第二個應用程式作業,而這正是我正在解決的問題所需要的。
下面是一個示例代碼來說明:
var numbers = new List<int> { 1, 2, 3 };
var words = new List<string> { "one", "two", "three" };
foreach (var (number, word) in Zip(numbers,words)) //this doesn't work
{
//do something
}
但是,上面的代碼會引發多個錯誤。我試圖操縱它看起來像微軟檔案中的例子,我讓它作業了。但是,正如您在下面的示例代碼中看到的那樣,它看起來過于冗余:
var numbers = new List<int> { 1, 2, 3 };
var words = new List<string> { "one", "two", "three" };
foreach (var (number, word) in numbers.Zip(words, (number,word) => (number,word))) //this lambda expression looks too repetitive
{
//do something
}
誰能幫我清理一下?
uj5u.com熱心網友回復:
可列舉.Zip
生成包含來自兩個指定序列的元素的元組序列。
您將需要使用
Enumerable.Zip(numbers,words)
或擴展方法
numbers.Zip(words)
同樣解構的元組var (first, second)是C# 7.0或更高版本
例子
var numbers = new List<int> { 1, 2, 3 };
var words = new List<string> { "one", "two", "three" };
foreach (var (first, second) in numbers.Zip(words))
Console.WriteLine($"{first},{second}");
輸出
1,one
2,two
3,three
演示在這里
如果您使用的是舊的和破壞的 .Net Framework或 pre .net core 3,那么除了使用Func引數之外,您別無選擇。但是,您可以使用偷偷摸摸的選擇器方法、委托、本地方法等
給定的
private static (T1, T2) Selector<T1,T2>(T1 t1, T2 t2) => (t1, t2);
用法
foreach (var (i, s) in numbers.Zip(words,Selector))
或者只是撰寫自己的擴展方法
public static IEnumerable<(TFirst,TSecond)> Zip<TFirst, TSecond>(
this IEnumerable<TFirst> first,
IEnumerable<TSecond> second)
=> first.Zip(second, (first1, second1) => (first1, second1));
uj5u.com熱心網友回復:
因此,如果您想將其用作方法而不是擴展方法,則首先需要使用三個引數:
Zip<TFirst,TSecond,TResult>(IEnumerable<TFirst>, IEnumerable<TSecond>, Func<TFirst,TSecond,TResult>)
第三個是Func。所以基本上你通過第二次代碼和平實作的是:
int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };
Func<int, string, (int, string)> func = (integer, str) => (integer, str);
var numbersAndWords = Enumerable.Zip(numbers, words, func);
foreach (var item in numbersAndWords)
{
//do smth
Console.WriteLine(item);
}
.NET 核心根據需要接受兩個引數:
int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };
var numbersAndWords = Enumerable.Zip(numbers, words);
foreach (var item in numbersAndWords)
{
//do smth
Console.WriteLine(item);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/340158.html
下一篇:將所有值從串列添加到串列串列
