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