Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/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# - Fatal编程技术网

C# 拆分重复项的列表

C# 拆分重复项的列表,c#,C#,因此,我在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, Item 1, It

因此,我在
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,
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,
Item 1,
Item 2,
Item 3,
Item 4,
Item 5,
Item 6,

感谢您的帮助。

假设列表中有字符串:

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);
                }
            }
var listOne=new List();
var listwo=新列表();
foreach(列表中的var项具有重复项)
{
如果(!listOne.Contains(项))
{
列表一。添加(项目);
}
其他的
{
清单2.添加(项目);
}
}

您可以维护一个
字典
对象来存储每个字符串对象的重复值计数。例如,如果“Item1”重复4次,“Item2”重复2次,依此类推。。您可以在dictionary对象中引用它。 基于此,您可以创建所需的大量列表。 下面是将其添加到字典中的代码

 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;
 }
}    
List l=新列表(){
//您的物品在这里吗
};
字典映射=新字典();
foreach(l中的字符串i)
{
如果(!map.ContainsKey(i)){map.Add(i,0);}
否则{
map[i]=map[i]+1;
}
}    

您可以尝试
GroupBy
:我们使用重复项将初始
列表分组(因此所有重复项现在都在各自的块中)

List listWithDuplicates=。。。
//TODO:您可能需要在此处放置自定义标准,例如。
//.GroupBy(item=>item.Id);
var groups=listWithDuplicates
.GroupBy(项目=>项目);
List ALLISTS=新列表();
foreach(组中的var组){
int指数=0;
foreach(组中的var项目){
名单;
if(allLists.Count>索引)
列表=所有列表[索引];
否则{
列表=新列表();
添加(列表);
}
列表。添加(项目);
指数+=1;
}
}

有很多方法可以做到这一点。我个人不喜欢林克处理这个问题。这是我的解决办法。我已经将这些项视为整数,但它可以适应任何类型,您只需为此更新相等性检查即可。这将生成n个列表,其中n是重复的数量(例如,如果4出现3次,则将生成3个列表)

列表列表=新列表();
int lastValue=0;
int countOfCurrent=0;
for(int i=0;i0)
{
countOfCurrent++;
}否则
{
电流计数=0;
}
if(countOfCurrent>=lists.Count)
{
添加(新列表{value});
}否则
{
列出[countOfCurrent]。添加(值);
}
lastValue=值;
}

这些项目是特定的对象,我们如何知道
项目1
和下一个
项目1
之间的区别?TBH,如果这是你关心的,为什么你允许复制品进入那里;创建单独的列表,并尽可能地处理。请更新您的帖子,以包含您尝试过的内容和不起作用的内容。项目的顺序是否始终保持不变,换句话说,您是否会遇到其他情况,例如:项目1、项目2、项目1、项目3、项目3、项目2项目的类型是什么?它们是绳子吗?如果你能分享一根绳子就太棒了。确保在代码中指定输入,同时对预期输出非常清楚。请确保在输入中包含一些项目,这些项目有一次、两次和三次。@Monty如果它们是不同的实例,那么我如何知道如何将此项目放在列表一中,将此项目放在另一个列表中;具体来说,我们可以使用这个对象的哪一部分来确定这个,否则就没有条件了。你提到过顺序可以是随机的,但单凭这一点并不能否定谁属于哪里……如果有三次呢?是的,我应该提到。。。可能有很多lists@andreasnico如果这是你的吻的想法,那就错了。您的示例可能很简单,但问题是它不正确,因为它不满足OP要求。。如果你能解释一下为什么你的
KISS
示例会起作用,这也会有所帮助。
GroupBy
可以用来简化这个过程。此外,如果密钥已经存在,
Add
也不起作用。还要考虑使用<代码> TyGETValue以避免不必要的哈希查找。更新逻辑。@ MjWess,同意您的意见。这只是另一种方法。答案的关键是使用地图,然后处理逻辑。@đěxěŕ因为我们在输入中不确定列表中每个项目的重复次数。字典(或Java中的hashmap)有助于存储每个项出现的次数,并且基于出现的最大项,用户可以处理其逻辑以创建任意多的列表。地图成为所有项目的集中位置,是一个固定的时间操作