[英]C# : How to get running combination from two List<String> based on a master list
[英]How to get moving combination from two List<String> in C#?
我有兩個包含的List<String>
ListOne
A
B
C
ListTwo
A
B
C
D
現在我需要將移動組合轉換為列表字符串
所以輸出列表將包含
A-B
A-C
A-D
B-C
B-D
C-D
現在我正在使用Nested for loop
。 有沒有辦法使用LINQ
或LAMBDA EXPRESSION
執行此操作請幫我這樣做。 提前致謝
示例代碼
List<String> ListOne = new List<string> { "A","B","C"};
List<String> ListTwo = new List<string> { "A", "B", "C", "D" };
List<String> Result = new List<string>(from X in ListOne
from Y in ListTwo
where X!=Y
select string.Format("{0}-{1}", X, Y));
但它沒有給出正確的輸出
It produces like
A-B
A-C
A-D
B-A
B-C
B-D
C-A
C-B
C-D
但是所需的輸出就像
A-B
A-C
A-D
B-C
B-D
C-D
使用For Loop
示例代碼
List<String> ResultTwo = new List<string>();
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<string> ListOne = new List<string>(){"A","B","C"};
List<string> ListTwo = new List<string>(){ "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 ? o.a + "-" + o.b : o.b + "-" + o.a into g
select g.Select(n => n.a + "-" + n.b).Take(1).ToArray()[0];
所以除了你想要所有的比賽
並沒有重復。
這里是:
IEnumerable<string> result =
(
from a in ListOne
from b in ListTwo
where a != b
select a.CompareTo(b) < 0 ? a + "-" + b : b + "-" + a
).Distinct();
說明要求是戰斗的90%。
如果您需要配對中的第一個項目來自第一個列表,這將執行此操作:
IEnumerable<string> 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<string> { "A", "B", "C" };
var listB = new List<string> { "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)));
如何將驗證邏輯添加到列表中
class Program
{
static void Main(string[] args)
{
List<string> a = new List<string>() { "C", "D", "L" };
List<string> b = new List<string>() { "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<Pair>
{
public new void AddRange(IEnumerable<Pair> 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 => a.X + "-" + a.Y);
Acualy,當我清理你的嵌套foreach代碼時,我比LINQ更喜歡它:
List<string> outList = new List<string>();
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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.