因此,我在c#
中有一个重复项的列表。我的问题比这稍微复杂一点,但是通过搜索可以找到非常具体的解决方案。我正在寻求更一般的帮助。
我的主列表包含
Item 1,
Item 2,
Item 1,
Item 2,
Item 3,
Item 3,
Item 4,
Item 4,
Item 5,
Item 5,
Item 6,
Item 6,
我需要像这样将其分为两个列表。...
列表1 .....
Item 1,
Item 2,
Item 3,
Item 4,
Item 5,
Item 6,
列表2 .....
Item 1,
Item 2,
Item 3,
Item 4,
Item 5,
Item 6,
谢谢您的任何帮助。
答案 0 :(得分:2)
您可以尝试GroupBy
:我们将初始listWithDuplicates
分为几组(因此所有重复项现在都在自己的块中)
List<MyItem> listWithDuplicates = ...
//TODO: You may want to put custom criterium here, e.g.
// .GroupBy(item => item.Id);
var groups = listWithDuplicates
.GroupBy(item => item);
List<List<MyItem>> allLists = new List<List<MyItem>>();
foreach (var group in groups) {
int index = 0;
foreach (var item in group) {
List<MyItem> list;
if (allLists.Count > index)
list = allLists[index];
else {
list = new List<MyItem>();
allLists.Add(list);
}
list.Add(item);
index += 1;
}
}
答案 1 :(得分:1)
您可以维护Dictionary<string,int>
对象,以存储每个字符串对象的重复值计数。例如,如果“ Item1”重复4次,“ Item2”重复2次,依此类推..您可以在字典对象中引用它。
基于此,您可以创建许多所需的列表。
以下是将其添加到字典中的代码
List<String> l = new List<string>(){
//your items here
};
Dictionary<string, int> map = new Dictionary<string, int>();
foreach(string i in l)
{
if (!map.ContainsKey(i)) { map.Add(i, 0); }
else{
map[i] =map[i] + 1;
}
}
答案 2 :(得分:1)
有很多方法可以做到这一点。我个人不喜欢LINQ。这是我的解决方案。我已经将这些项视为整数,但是可以将其适应于您只需要为此更新相等性检查的任何类型。这将创建n个列表,其中n是重复项的数量(例如,如果4次出现3次,则将创建3个列表)
List<List<int>> lists = new List<List<int>>();
int lastValue = 0;
int countOfCurrent = 0;
for(int i = 0; i < list.Count; i++)
{
int value = list[i];
if(value == lastValue && i > 0)
{
countOfCurrent++;
} else
{
countOfCurrent = 0;
}
if(countOfCurrent >= lists.Count)
{
lists.Add(new List<int> { value });
} else
{
lists[countOfCurrent].Add(value);
}
lastValue = value;
}
答案 3 :(得分:0)
假定列表中的字符串:
var listOne = new List<string>();
var listTwo = new List<string>();
foreach (var item in listWithDuplicats)
{
if (!listOne.Contains(item))
{
listOne.Add(item);
}
else
{
listTwo.Add(item);
}
}