根据项目更改字符串列表

Alter a list of strings based on the items

在将列表输出回客户端之前,我想更改列表。

为了这个问题,我将 post 列表的示例以及我需要如何查看结果,因为我已经查看了 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;
    }
private static List<List<string>> FilterData(List<List<string>> datatable)
{
    var result = new List<List<string>>();

    for(var rowindex = 0; rowindex < datatable.Count; rowindex++)
    {
        // Clone the string list
        var refrow = datatable[rowindex]
            .Select(item => (string)item.Clone()).ToList(); 

        result.Add(refrow);

        // First row will not get modify anyway
        if (rowindex == 0) continue;

        var row = result[rowindex];
        // previous row of result has changed to "-", so use the original row to compare
        var prevrow = datatable[rowindex - 1]; 
        for(var columnindex = 0; columnindex < row.Count; columnindex++)
        {
            if (row[columnindex] == prevrow[columnindex])
                row[columnindex] = "-";
        }
    }

    return result;
}

fiddle

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

您必须在代码中更改一些内容;

代码如下:

 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