簡體   English   中英

System.ArgumentOutOfRangeException LINQ C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM