[英]System.ArgumentOutOfRangeException linq c#
我必須編寫一個程序,以每列的域。
我的代碼是這樣,但是當我想播放時拋出異常(System.ArgumentOutOfRangeException)。
string[] all_lines = { "1, 2, 3" , "4, 5, 6", "4, 2, 3", "4, 2, 6", "9, 8, 7" };
string[] separator = new string[] { ", " };
int nAtt = all_lines[0].Split(separator, StringSplitOptions.RemoveEmptyEntries).Count() ;
List<IEnumerable> dom = new List<IEnumerable>();
for (int i = 0; i < nAtt; i++)
{
var ele = (from lines in all_lines
let data = lines.Split(separator, StringSplitOptions.RemoveEmptyEntries)
select data.ElementAt(i)).Distinct();
dom.Add(ele);
}
foreach (var row in dom)
{
Console.Write("( ");
foreach (var ele in row)
Console.Write("{0} ", ele);
Console.WriteLine(")");
}
此代碼的輸出應為:
(1 4 9)
(2 5 8)
(3 6 7)
有沒有解決方案或替代方案?
有關閉問題。 在這里看到ElementAt(i)
。
for (int i = 0; i < nAtt; i++)
{
var ele = (from lines in all_lines
let data = lines.Split(separator, StringSplitOptions.RemoveEmptyEntries)
select data.ElementAt(i)).Distinct();
dom.Add(ele);
}
這個查詢將使用變量i
它的自我。 它不是副本。 因此,在循環完成后, i
變成nAtt
並且在嘗試使用它時會遇到異常。 因此您必須先存儲變量,然后再使用它。
var i1 = i;
var ele = (from lines in all_lines
let data = lines.Split(separator, StringSplitOptions.RemoveEmptyEntries)
select data.ElementAt(i1)).Distinct();
dom.Add(ele);
你的技術是因為非常低效的,通過使用.Count()
和.ElementAt()
多次,你是不必要重申你可枚舉,許多倍。
一種更有效,更優雅,更不易出錯的方法可能是:
var dom = all_lines
.SelectMany(line => line
.Split(new[]{", "}, StringSplitOptions.RemoveEmptyEntries)
.Select((x, i) => new{x, i}))
.GroupBy(x => x.i)
.Select(g => g.Select(gi => gi.x).Distinct())
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.