-1

クライアントに出力する前に変更したいリストに問題があります。

質問のために、リストの例と、どのように結果を表示する必要があるかを投稿します。なぜなら、Intersect、Except、および考えられる他のすべてを見てきましたが、探している結果が得られなかったからです。 .

例のリスト:

1, 4, 6, 8
1, 2, 6, 8
2, 4, 6, 8
3, 4, 5, 7

必要な結果:

1, 4, 6, 8 //最初の行
-, 2, -, - //変更されていない項目は -
2, 4, -, -
3, -, 5, 7として表示されます

うまく説明できたことを本当に願っています。

必要に応じて、これについてさらに説明させていただきます。

アドバイスをお寄せいただきありがとうございます。これまでのところ、私はこれについて頭を悩ませてきました。;)

私が試したことは多すぎてここに入力できません。行が異なると見なされるため、例外は単にデータに対して何もしないため、同じままです。

private List<List<string>> FilterData(List<string[]> datatable)
    {
        List<string> previousRow = new List<string>();
        List<string> currentRow = new List<string>();
        List<string> rowDifferences = new List<string>();

        List<List<string>> resultingDataset = new List<List<string>>();

        foreach (var item in datatable)
        {
            if (previousRow == null)
            {
                previousRow = item.ToList();
                continue;
            }

            currentRow = item.ToList();

            rowDifferences = currentRow.Except(previousRow).ToList();
            resultingDataset.Add(rowDifferences);
        }
        return resultingDataset;
    }
4

3 に答える 3

0
public static List<List<T>> RemoveDuplicates<T>(this List<List<T>> items, T replacedValue) where T: class
{
    List<List<T>> ret = items;

    items.ForEach(m=> {
        var ind = items.IndexOf(m);

        if(ind==0)
        {
            ret.Add(items.FirstOrDefault());
        }
        else
        {
            var prevItem = items.Skip(items.IndexOf(m)-1).FirstOrDefault();

            var item = new List<T>();
            for(var a = 0; a < prevItem.Count; a++)
            {
                item.Add(prevItem[a] == m[a]? replacedValue : m[a]);
            }

            ret.Add(item);
        }
    });

    return ret;
}

それの使い方:

var items = new List<List<string>>{
    new List<string>{ "1", "4", "6", "8" },
    new List<string>{ "1", "2", "6", "8" },
    new List<string>{ "2", "4", "6", "8" },
    new List<string>{ "3", "4", "5", "7" }
};

var result = items.RemoveDuplicates("-");

dotNetFiddle: https://dotnetfiddle.net/n36p64

于 2015-09-10T06:54:48.613 に答える
0

コードで変更する必要があるものはほとんどありません。

コードは次のとおりです。

 private List<string[]> FilterData(List<string[]> datatable)
    {
        // List is made of String Array, so need string[] variable not list
        string[] previousRow = null ;
        string[] currentRow;
        string[] rowDifferences ;

        // to store the result
        List<string[]> resultingDataset = new List<string[]>();

        foreach (var item in datatable)
        {
            if (previousRow == null)
            {
                previousRow = item;
                resultingDataset.Add(previousRow); // add first item to list
                continue;
            }

            currentRow = item; 

            // check and replace with "-" if elment exist in previous 
            rowDifferences = currentRow.Select((x, i) => currentRow[i] == previousRow[i] ? "-" : currentRow[i]).ToArray();  
            resultingDataset.Add(rowDifferences);

            // make current as previos
            previousRow = item;
        }
        return resultingDataset;
    }

このdotnetfiddleを確認してください

于 2015-09-10T07:25:42.523 に答える