我有一个对象的列表,我想从中进行唯一组合。如何高效地获取对象列表的唯一组合
我有的对象是(CityObj);
public string City_Name;
public int Population;
double xcord;
double ycord;
double zcord;
其结果将是,其中包含一个新的对象(CityComboObj)
public string City_NameA;
public int PopulationA;
double xcordA;
double ycordA;
double zcordA;
public string City_NameB;
public int PopulationB;
double xcordB;
double ycordB;
double zcordB;
数据集的样本的列表如下;
- City1 | 3840 | 42 | -12 | 5
- City2 | 39402 | 1 | 59 | -5
- City3 | 5934 | 99 | -55 | 3
- City4 | 12394 | -56 | 9 | 16
对象的结果列表看起来像;
City1 | 3840 | 42 | -12 | 5城市2 | 39402 | 1 | 59 | -5
City1 | 3840 | 42 | -12 | 5城市3 | 5934 | 99 | -55 | 3
City1 | 3840 | 42 | -12 | 5城市4 | 12394 | -56 | 9 | 16
City2 | 39402 | 1 | 59 | -5 City3 | 5934 | 99 | -55 | 3
City2 | 39402 | 1 | 59 | -5 City4 | 12394 | -56 | 9 | 16
City3 | 5934 | 99 | -55 | 3城市4 | 12394 | -56 | 9 | 16
正如你所见,它只返回了唯一的结果。
目前我正在使用可怕的低效apporach去做这件事;
foreach (var element in CityListA)
{
if (!CityListB.Any(o => o.City_NameA == element.City_NameA && o.City_NameB == element.City_NameB))
{
if (!CityListB.Any(o => o.City_NameA == element.City_NameB && o.City_NameB == element.City_NameA))
{
CityListB.add(element)
}
}
}
一言以蔽之的做法是采取两个列表一个完整的和一个空的,比较空单的完整列表中的每个元素,看它是否存在,或转存在,如果它不添加它。
它有效,但速度很慢,有没有更好的方法来做到这一点?
谢谢
你可以结合'Any'电话,换一个。 – Abion47
如何以'if(!CityListB.Any(o =>(o.City_NameA == element.City_NameA && o.City_NameB == element.City_NameB)||(o.City_NameA == element.City_NameB && o.City_NameB) == element.City_NameA)))'所以你没有循环两次? –
你的问题是“我有一系列长度为n的独特项目,我希望生成长度为k <= n的所有子序列。我写了一系列关于不同技术的文章。系列从这里开始:https://ericlippert.com/2014/10/13/producing-combinations-part-one/但是,如果您对理论不感兴趣并且只想要代码,那么它就在这里:https:// gist.github.com/ericlippert/69c9e93b366f8cc5d6ac –