我有這樣的陣列,值是字串:
var arr1 = new [] { "H", "item1", "item2" };
var arr2 = new [] { "T", "thing1", "thing2" };
var arr3 = new [] { "T", "thing1", "thing2" };
var arr4 = new [] { "END", "something" };
var arr5 = new [] { "H", "item1", "item2" };
var arr6 = new [] { "T", "thing1", "thing2" };
var arr7 = new [] { "T", "thing1", "thing2" };
var arr8 = new [] { "END", "something" };
var allArrays = new [] { arr1, arr2, arr3, arr4, arr5, arr6, arr7, arr8 };
我需要將其分組到一個新的陣列陣列中,以便一個陣列具有以Hor開頭的陣列T。END記錄(不包括在結果中)是每個部分之間的分隔符;每個新陣列都在陣列之后開始END。
最后我想要這樣的東西:
[
[ [H, item1, item2], [T, thing1, thing2], [T, thing1, thing2] ]
[ [H, item1, item2], [T, thing1, thing2], [T, thing1, thing2] ]
]
我知道如何為每個回圈執行此操作,但我正在尋找一種更清潔的方法,可能使用 linq。非常重視所有建議,謝謝!
uj5u.com熱心網友回復:
你可以試試這個
List<string[]> list = new List<string[]>();
var newArr = allArrays.Select(a => AddToArr(list, a)).Where(a => a != null);
和助手(這段代碼可以行內,但這樣更容易閱讀)
private static string[][] AddToArr(List<string[]> list, string[] arr)
{
if (arr[0] != "END")
{
list.Add(arr);
return null;
}
var r = list.ToArray();
list.Clear();
return r;
}
結果
[
[["H","item1","item2"],["T","thing1","thing2"],["T","thing1","thing2"]],
[["H","item3","item4"],["T","thing3","thing4"],["T","thing5","thing6"]]
]
uj5u.com熱心網友回復:
所以 arr1、arr2 等是string[].
allArrays是一個string[][].
我希望你舉了一個有意義的例子。從這個例子中,您似乎想要所有 string[] from allArrays,除了 string[] 的 [0] 等于單詞“END”。
如果這是你想要的,你的結果是:
string[][] result = allArrays.Where(stringArray => stringArray[0] != "END");
我需要將其分組到一個新的陣列陣列中,以便一個陣列具有以 H 或 T 開頭的陣列。END 記錄(不包括在結果中)是每個部分之間的分隔符;每個新陣列都在 END 陣列之后開始。
這與我在您的示例中看到的不完全相同:如果 allArrays 中的字串陣列之一是空陣列,或者它的值為 null 值,該怎么辦。如果字串陣列之一為空(= 長度 0),如果字串陣列之一不是以“H”、“T”或“END”開頭怎么辦?
從字面上看,你說你只想要以“H”或“T”開頭的字串陣列,沒有其他的。您不需要為空的字串陣列,也不需要為空的字串陣列。您也不想要以“END”開頭的字串陣列,也不想要以 String.Empty、“A”或“B”或“H”或“T”以外的任何其他內容開頭的字串陣列。
如果我從字面上理解您的要求,您的代碼應該是:
string[] requiredStringAtIndex0 = new string[] {"H", "T"};
string[][] result = allArrays.Where(stringArray => stringArray != null
&& stringArray.Length != 0
&& requiredStringAtIndex0.Contains(stringArray[0]));
換句話說:從 allArrays 中,只保留那些不為空的字串陣列,并且至少有一個元素并且索引 0 處的元素包含“H”或“T”
uj5u.com熱心網友回復:
通常我會使用擴展方法基于謂詞對專案運行進行分組,在這種情況下GroupByEndingWith,然后丟棄“END”記錄,如下所示:
var ans = allArrays.GroupByEndingWith(r => r[0] == "END")
.Select(g => g.Drop(1).ToArray())
.ToArray();
但是,一般來說,您可以使用Aggregate以犧牲理解為代價來基于謂詞收集專案。它通常有助于使用元組來跟蹤整體累加器和子累加器。不幸的是,沒有運算符 或回傳原始串列(有助于基于運算式的累積),并且由于 C# 還沒有等效的逗號運算子,因此您需要再次擴展方法,或者您可以使用.AppendList<T>ImmutableList
使用Aggregateand ImmutableList,您可以執行以下操作:
var ans = allArrays.Aggregate(
(ans: ImmutableList<ImmutableList<string[]>>.Empty, curr: ImmutableList<string[]>.Empty),
(ac, r) => r[0] == "END"
? (ac.ans.Add(ac.curr), ImmutableList<string[]>.Empty)
: (ac.ans, ac.curr.Add(r))
).ans
.Select(l => l.ToArray())
.ToArray();
注意:List如果您愿意創建新的Listsa lot,您也可以這樣做:
var ans = allArrays.Aggregate(
(ans: new List<List<string[]>>(), curr: new List<string[]>()),
(ac, r) => r[0] == "END"
? (ac.ans.Concat(new[] { ac.curr }).ToList(), new List<string[]>())
: (ac.ans, ac.curr.Concat(new[] { r }).ToList())
).ans
.Select(l => l.ToArray())
.ToArray();
uj5u.com熱心網友回復:
這是一個簡單的實作。
public static void Main(string[] args)
{
var data = ConvertToArrayOfArray(arr1, arr2, arr3, arrr4, arr5, arr6, arr7, arr8);
}
private string[][] ConvertToArrayOfArray(params string[][] arrs)
{
List<string[]> yoList = new List<string[]>();
arrs.ToList().ForEach(x =>
{
if(!x[0] == "END") yoList.Add(x);
});
return yoList.ToArray();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/428904.html
