如何从C#中的两个List 获取移动组合?

我有两个包含的List

 ListOne A B C ListTwo A B C D 

现在我需要将移动组合转换为列表字符串

所以输出列表将包含

  AB AC AD BC BD CD 

现在我正在使用Nested for loop 。 有没有办法使用LINQLAMBDA EXPRESSION这样做请帮我这样做。 提前致谢

示例代码

 List ListOne = new List { "A","B","C"}; List ListTwo = new List { "A", "B", "C", "D" }; List Result = new List(from X in ListOne from Y in ListTwo where X!=Y select string.Format("{0}-{1}", X, Y)); 

但它没有给出正确的输出

  It produces like AB AC AD BA BC BD CA CB CD 

但是所需的输出就像

  AB AC AD BC BD CD 

使用For Loop示例代码

 List ResultTwo = new List(); for (int i = 0; i < ListOne.Count; i++) { for (int j = 0; j < ListTwo.Count; j++) { if(ListOne[i] != ListTwo[j]) if (ResultTwo.Contains(ListOne[i] + "-" + ListTwo[j]) == false && ResultTwo.Contains(ListTwo[j] + "-" + ListOne[i]) == false) ResultTwo.Add(ListOne[i] + "-" + ListTwo[j]); } } 

它的工作正常….但我只需要一个简单的方法(使用LINQ

在你的编辑后,这应该做的伎俩:

 List ListOne = new List(){"A","B","C"}; List ListTwo = new List(){ "A","B","C","D"}; var result = from a in ListOne from b in ListTwo let condition = a.CompareTo(b) where condition != 0 select condition < 0 ? a + "-" + b : b + "-" + a; foreach (var v in result.Distinct()) { Console.WriteLine(v); } 

保留顺序的第二个版本(ItemFromList1 - ItemFromList2):

  var result = from o in ( from a in ListOne from b in ListTwo let condition = a.CompareTo(b) where condition != 0 select new { a, b, condition } ) group o by o.condition < 0 ? oa + "-" + ob : ob + "-" + oa into g select g.Select(n => na + "-" + nb).Take(1).ToArray()[0]; 

所以除了你想要所有的比赛

  • 项目与自己匹配
  • 项目与较小的项目匹配

并没有重复。

这里是:

 IEnumerable result = ( from a in ListOne from b in ListTwo where a != b select a.CompareTo(b) < 0 ? a + "-" + b : b + "-" + a ).Distinct(); 

陈述要求是战斗的90%。


如果您需要配对中的第一个项目来自第一个列表,这将执行此操作:

 IEnumerable result = ( from a in ListOne from b in ListTwo select new { A = a, B = b, Combo = a.CompareTo(b) < 0 ? a + "-" + b : b + "-" + a } into x group x by x.Combo into g select g.Select(x2 => x2.A + "-" + x2.B).First() ) 
 var listA = new List { "A", "B", "C" }; var listB = new List { "A", "B" }; var result = listA.SelectMany((a, indexA) => listB.Where((b, indexB) => listB.Contains(a) ? !b.Equals(a)&&indexB > indexA : !b.Equals(a)) .Select(b => string.Format("{0}-{1}", a, b))); 

如何将validation逻辑添加到列表中

 class Program { static void Main(string[] args) { List a = new List() { "C", "D", "L" }; List b = new List() { "C", "L", "C", "D" }; var pairValuesNotEqual = from vara in a from varb in b where vara != varb select new Pair(vara, varb); Set sets = new Set(); sets.AddRange(pairValuesNotEqual); foreach (var item in sets) { Console.WriteLine(item.First + " - " + item.Second); } Console.ReadLine(); } } public class Set : List { public new void AddRange(IEnumerable pairs) { foreach (var item in pairs) { this.Add(item); } } public new void Add(Pair item) { if (!IsExists(item)) base.Add(item); } private bool IsExists(Pair item) { foreach (Pair i in this) { if (i.First == item.Second && i.Second == item.First) return true; } return false; } } 

我不认为LINQ对此有好处,我得到了这个,但它看起来并不好看:

  var A = from one in ListOne from two in ListTwo where one != two let x = one.CompareTo(two) < 0 ? one : two let y = one.CompareTo(two) < 0 ? two : one select new { X = x, Y = y}; var B = A.Distinct().Select(a => aX + "-" + aY); 

Acualy,当我清理你的嵌套foreach代码时,我比LINQ更喜欢它:

  List outList = new List(); foreach (string s1 in ListOne) { foreach (string s2 in ListTwo) { if (s1 != s2 && !outList.Contains(s1 + "-" + s2) && !outList.Contains(s2 + "-" + s1)) { outList.Add(s1 + "-" + s2); } } }