Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除重复项并返回订单号_C#_Linq - Fatal编程技术网

C# 删除重复项并返回订单号

C# 删除重复项并返回订单号,c#,linq,C#,Linq,我想删除列表中的重复项。我可以使用Distinct()轻松实现它。但我还需要获取已删除项的顺序号。我在linq中找不到任何函数来解决此问题,并最终使用以下代码实现它: public List<string> Repeat(List<string> str) { var Dlist = str.Distinct(); List<string> repeat = new List<string>();

我想删除列表中的重复项。我可以使用Distinct()轻松实现它。但我还需要获取已删除项的顺序号。我在linq中找不到任何函数来解决此问题,并最终使用以下代码实现它:

    public List<string> Repeat(List<string> str)
    {
        var Dlist = str.Distinct();
        List<string> repeat = new List<string>();
        foreach (string aa in Dlist)
        {
            int num = 0;
            string re = "";
            for (int i = 1; i <= str.LongCount(); i++)
            {
                if (aa == str[i - 1])
                {
                    num = num + 1;
                    re = re + " - " + i;
                }
            }
            if (num > 1)
            {
                repeat.Add(re.Substring(3));
            }
        }
        return repeat;
    }
public static void Main()
{
    var str = new List<string>
    {
        "bla",
        "bla",
        "baum",
        "baum",
        "nudel",
        "baum",
    };
    var copy = new List<string>(str);
    var repeated = str.GroupBy(s => s).Where(group => group.Any())
        .Select(group => string.Join(" - ",
            group.Select((s, i) =>
                Enumerable.Range(1, str.Count).Where(i2 => str[i2 - 1] == group.Key).ToList()[i])));
    var repeated2 = Repeat(str);
    var repeated3 = str.GroupBy(s => s).Where(group => group.Any())
        .Select(group =>
        {
            var indices = Enumerable.Range(1, str.Count).Where(i => str[i-1] == group.Key).ToList();
            return string.Join(" - ", group.Select((s, i) => indices[i]));
        });

    Console.WriteLine(string.Join("\n", repeated) + "\n");
    Console.WriteLine(string.Join("\n", repeated2) + "\n");
    Console.WriteLine(string.Join("\n", repeated3));
    Console.ReadLine();
}

public static List<string> Repeat(List<string> str)
{
    var distinctItems = str.Distinct();
    var repeat = new List<string>();
    foreach (var item in distinctItems)
    {
        var added = false;
        var reItem = "";
        for (var index = 0; index < str.LongCount(); index++)
        {
            if (item != str[index]) 
                continue;
            added = true;
            reItem += " - " + (index + 1);
        }

        if (added)
            repeat.Add(reItem.Substring(3));
    }

    return repeat;
}
公共列表重复(列表str)
{
var Dlist=str.Distinct();
列表重复=新列表();
foreach(数据列表中的字符串aa)
{
int num=0;
字符串re=“”;
对于(int i=1;i 1)
{
重复。添加(关于子字符串(3));
}
}
返回重复;
}

有没有其他更简单的方法来解决这个问题?或者linq中是否有我遗漏的功能?如果您有任何建议,我们将不胜感激。

在您的
repeat
方法中,您可以使用以下方法获得重复项

var repeated = str.GroupBy(s=>s)
      .Where(grp=>grp.Count()>1)
      .Select(y=>y.Key)
      .ToList();

如果我没有弄错的话,此查询与您的函数完全相同:

var repeated = str.GroupBy(s => s).Where(group => group.Any())
    .Select(group =>
    {
        var indices = Enumerable.Range(1, str.Count).Where(i => str[i-1] == group.Key).ToList();
        return string.Join(" - ", group.Select((s, i) => indices[i]));
    });
它首先对原始列表中的项目进行分组,以便具有相同内容的每个项目都在一个组中。然后在原始列表中搜索组中项目的所有索引,这样我们就有了组中原始项目的所有索引。然后,它将索引连接到一个字符串,以便生成的格式与您请求的格式相似。您还可以将此语句lambda转换为匿名lambda:

var repeated = str.GroupBy(s => s).Where(group => group.Any())
    .Select(group => string.Join(" - ",
        group.Select((s, i) =>
            Enumerable.Range(1, str.Count).Where(i2 => str[i2 - 1] == group.Key).ToList()[i])));
但是,这会显著降低性能


我使用以下代码对此进行了测试:

    public List<string> Repeat(List<string> str)
    {
        var Dlist = str.Distinct();
        List<string> repeat = new List<string>();
        foreach (string aa in Dlist)
        {
            int num = 0;
            string re = "";
            for (int i = 1; i <= str.LongCount(); i++)
            {
                if (aa == str[i - 1])
                {
                    num = num + 1;
                    re = re + " - " + i;
                }
            }
            if (num > 1)
            {
                repeat.Add(re.Substring(3));
            }
        }
        return repeat;
    }
public static void Main()
{
    var str = new List<string>
    {
        "bla",
        "bla",
        "baum",
        "baum",
        "nudel",
        "baum",
    };
    var copy = new List<string>(str);
    var repeated = str.GroupBy(s => s).Where(group => group.Any())
        .Select(group => string.Join(" - ",
            group.Select((s, i) =>
                Enumerable.Range(1, str.Count).Where(i2 => str[i2 - 1] == group.Key).ToList()[i])));
    var repeated2 = Repeat(str);
    var repeated3 = str.GroupBy(s => s).Where(group => group.Any())
        .Select(group =>
        {
            var indices = Enumerable.Range(1, str.Count).Where(i => str[i-1] == group.Key).ToList();
            return string.Join(" - ", group.Select((s, i) => indices[i]));
        });

    Console.WriteLine(string.Join("\n", repeated) + "\n");
    Console.WriteLine(string.Join("\n", repeated2) + "\n");
    Console.WriteLine(string.Join("\n", repeated3));
    Console.ReadLine();
}

public static List<string> Repeat(List<string> str)
{
    var distinctItems = str.Distinct();
    var repeat = new List<string>();
    foreach (var item in distinctItems)
    {
        var added = false;
        var reItem = "";
        for (var index = 0; index < str.LongCount(); index++)
        {
            if (item != str[index]) 
                continue;
            added = true;
            reItem += " - " + (index + 1);
        }

        if (added)
            repeat.Add(reItem.Substring(3));
    }

    return repeat;
}

好。我还将
Repeat(List str)
更改为
GetDuplicates(List items)
。我没有问这个问题,因此无法标记它是否已回答。我只能上传你的答案。这是获得重复项目的好方法。但就像前面的答案一样,它只能得到重复的上下文,而不能得到它们的顺序号。你可以从“select”语句部分获得顺序号。似乎在执行group by之后,重复的项目将被放入一个组中。同时,他们将失去他们的主要号码。我需要什么。我弄错了吗?thx,我从你的答案中学到了很多。但似乎解决问题的每一种方法都有点复杂。我想也许有一天MS应该添加该功能:)